Проблема со свойством зависимости - PullRequest
1 голос
/ 26 февраля 2010

Я пытаюсь создать статическое свойство, и единственный способ найти это - использовать 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);
        }
    }

И это прекрасно компилируется, но когда я пытаюсь установить начальное значение 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

Код доступа к единственному экземпляру:

public static readonly ErrorLog Instance = new ErrorLog();

То, что я пытаюсь сделать, - это иметь статическое свойство UnreadMessages, которое я могу связать в своем классе Main, чтобы я мог отображать, есть ли какие-либо непрочитанные сообщения об ошибках, о которых пользователь должен знать.

Я пытался использовать одноэлементный подход, но не могу связать ErrorLog.Instance.UnreadMessages.

Может ли кто-нибудь мне помочь?

1 Ответ

1 голос
/ 26 февраля 2010

Я мог бы воспроизвести проблему. В вашем классе 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.

На 2-й ноте XAML неверен. {x: Static} ожидает имя типа в качестве первого параметра, а не экземпляра. И UnreadMessages не является статичным, DP является. Не используйте DP для создания статических свойств.

Если вам нужно статическое свойство, просто объявите его в своем классе контекста code-behind / data и свяжите его с {x: Static}.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...