我正在尝试创建一个静态属性,而我找到的唯一方法就是使用DependencyProperty。
我在班上创建了以下字段:
public static readonly DependencyProperty UnreadMessagesProperty = DependencyProperty.Register("UnreadMessages", typeof(int), typeof(ErrorLog));
public int UnreadMessages
{
get
{
return (int)GetValue(ErrorLog.UnreadMessagesProperty);
}
set
{
SetValue(ErrorLog.UnreadMessagesProperty, value);
}
}
这编译得很好,但是当我尝试使用以下代码将contructor中的UnreadMessages的初始值设置为0时:
public ErrorLog()
{
this.UnreadMessages = 0;
}
我收到以下异常
Exception has been thrown by the target of an invocation.
Error at object 'System.Windows.Data.Binding' in markup file 'Dashboard;component/main.xaml'.
内部异常消息如下:
Value cannot be null.
Parameter name: dp
内部异常的完整堆栈跟踪:
at System.Windows.DependencyObject.SetupPropertyChange(DependencyProperty dp)
at System.Windows.DependencyObject.SetValue(DependencyProperty dp, Object value)
at Dashboard.ErrorLog.set_UnreadMessages(Int32 value) in ErrorLog.xaml.cs:line 67
at Dashboard.ErrorLog..ctor() in ErrorLog.xaml.cs:line 97
at Dashboard.ErrorLog..cctor() in ErrorLog.xaml.cs:line 33
Singleton Instance Approach代码:
public static readonly ErrorLog Instance = new ErrorLog();
我想要做的是,有一个静态的UnreadMessages属性,我可以在我的Main类中绑定它,这样我就可以显示是否有任何未读的错误消息需要让用户知道。
我尝试使用单例方法,但似乎无法绑定到ErrorLog.Instance.UnreadMessages。
有人可以帮帮我吗?
答案 0 :(得分:1)
我可以重现这个问题。 在你的ErrorLog课程中,我猜你有:
public static readonly ErrorLog Instance = new ErrorLog();
public static readonly DependencyProperty UnreadMessagesProperty = DependencyProperty.Register("UnreadMessages", typeof(int), typeof(ErrorLog));
将其更改为:
public static readonly DependencyProperty UnreadMessagesProperty = DependencyProperty.Register("UnreadMessages", typeof(int), typeof(ErrorLog));
public static readonly ErrorLog Instance = new ErrorLog();
订单简单地颠倒了。 这两个元素都是静态的并且引用相同的类型,因此.NET无法对其进行排序。在第一种情况下,创建实例并在实例化之前使用DP。
您可以通过在创建DP时指定默认值来避免此问题。
在第二个注释中,XAML是错误的。 {x:Static}期望类型名称作为第一个参数,而不是实例。并且UnreadMessages不是静态的,DP是。 不要使用DP来创建静态属性。
如果需要静态属性,只需在代码隐藏/数据上下文类中声明一个并将其与{x:Static}绑定。