2013-11-01 5 views
0

)Класс, реализующий INotifyPropertyChanged. WPF

Пожалуйста, посмотрите на код ниже:

public class MyClass : INotifyPropertyChanged 
{ 
    private string _myName; 

    public string MyName 
    { 
     get { return _myName; } 
     set 
     { 
      if (_myName != value) 
      { 
       _myName = value; 
       OnPropertyChanged("MyName"); 
      } 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 


    private void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

Объект этого класса используется в качестве DataContext для управления TextBox в WPF форме.

Идея проста: изменения, внесенные в свойство MyName этого объекта, должны быть автоматически отображены в текстовом поле. Это работает, но я не понимаю, почему.

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

Мы устанавливаем новое значение для MyName. Программа переходит в «сеттер», и она вызывает «OnPropertyChanged». Он переходит в «OnPropertyChanged» и проверяет, является ли свойство PropertyChanged равным null.

И это не так. И я не знаю, почему, поскольку я не добавляю никаких обработчиков событий к этому событию.

Итак ... как это работает?

Спасибо!

+0

возможно дубликат [Как работает WPF INotifyPropertyChanged?] (Http://stackoverflow.com/questions/6789236/how-does-wpf-inotifypropertychanged-work) –

+0

вы в идеале должны измениться, если (PropertyChanged! = NULL) PropertyChanged (это новый PropertyChangedEventArgs (propertyName)); to var handler = PropertyChanged; if (handler! = null) обработчик (это новый PropertyChangedEventArgs (propertyName)); как если бы обработчик propertychanged был изменен между проверкой if и вызовом, тогда вы получаете исключение null ref – MikeT

ответ

1

Обработчик событий добавляется автоматически, когда вы привязываете объект к DataContext.

+0

Я заметил, что если MyClass не реализует 'INotifyPropertyChanged', то он не работает так, как вам захочется. Каков более глубокий смысл реализации этого интерфейса здесь? –

+1

@JacekWojcik. Внедрив интерфейс, вы указываете WPF, что вы несете ответственность за уведомление фреймворка, когда что-то меняется, и поле на вашем объекте нуждается в повторной визуализации. Если вы не реализуете интерфейс, вы не даете такого обещания WPF, и он пытается что-то сделать сам. –

+0

Вы понимаете, что это буквально одна строка, справа^_ ^? – UIlrvnd

Смежные вопросы