依赖属性的问题

时间:2010-02-26 09:46:39

标签: c# wpf data-binding static

我正在尝试创建一个静态属性,而我找到的唯一方法就是使用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。

有人可以帮帮我吗?

1 个答案:

答案 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}绑定。