Как работает WPF INotifyPropertyChanged?

Это типичная реализация INotifyPropertyChanged для использования Binding в WPF / C #.

namespace notifications.ViewModel { class MainViewModel : INotifyPropertyChanged { public const string NamePropertyName = "CheckBoxState"; private bool _checkboxstate = true; public bool CheckBoxState { get { return _checkboxstate; } set { if (_checkboxstate == value) return; _checkboxstate = value; RaisePropertyChanged(NamePropertyName); } } public event PropertyChangedEventHandler PropertyChanged; private void RaisePropertyChanged(string propertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } } } 

У меня также есть код XAML, который имеет привязку к CheckBoxState . введите описание изображения здесь

       

Это MainWindow.xaml.cs для связи между DataContext и моделью.

 public partial class MainWindow : Window { notifications.ViewModel.MainViewModel model = new notifications.ViewModel.MainViewModel(); public MainWindow() { InitializeComponent(); this.DataContext = model; } } 

Когда пользователь устанавливает этот флажок, я думаю, что произойдет следующее: IsChecked становится истинным, а с помощью "{Binding Path=CheckBoxState, Mode=TwoWay}" свойство CheckBoxState становится истинным для вызова RaisePropertyChanged() и, соответственно, PropertyChanged() , Поскольку параметром этой функции является CheckBoxState , каждый Binding с Path CheckBoxState уведомляется об обновлении.

  • Как этот вызов активирует ? Какая у него C # магия, чтобы сделать это возможным?
  • Почему требуется if (PropertyChanged != null) ? Кто настраивает PropertyChanged на какое значение?
  • Смысл Mode=TwoWay выглядит так, что он может не только сигнализировать об изменении, но также обновлять контент, когда другой элемент Binding с тем же именем в привязке меняется, а что же касается режима OneWay? Можем ли мы установить привязку только как источник или цель?

Как активируется этот вызов? Какая у него C # магия, чтобы сделать это возможным?

Этот код создает объект Binding который связывает свойство TextBlock Text с свойством ViewModel. Он также добавляет обработчик событий в событие PropertyChanged в ViewModel для обновления текстового значения, когда ViewModel запускает событие PropertyChanged (с правом свойства).

Почему требуется if (PropertyChanged != null) ? Кто настраивает PropertyChanged на какое значение?

Если событие PropertyChanged равно null, то его запуск приведет к исключению NullReferenceException.

Смысл Mode=TwoWay выглядит так, что он может не только сигнализировать об изменении, но также обновлять контент, когда другой элемент Binding с тем же именем в привязке меняется, а что же касается режима OneWay? Можем ли мы установить привязку только как источник или цель?

Режимы привязки:

  • TwoWay: изменяет связанное значение при изменении свойства ViewModel и наоборот
  • OneWay: изменяет связанное значение только при изменении свойства ViewModel
  • OneWayToSource: изменяет свойство ViewModel при изменении только значения привязки
  • OneTime: устанавливает связанное значение в значение свойства ViewModel только при создании приложения или изменении контекста данных.

Подробнее о них вы можете узнать здесь: http://msdn.microsoft.com/en-us/library/system.windows.data.bindingmode.aspx

  • Кадрирование изображений WPF
  • Как получить список коллекции значений из app.config в WPF?
  • Как перезапустить приложение WPF?
  • Приложение WPF из Visual Studio 2010 выходит из строя Windows 7
  • WPF показывает диалог перед основным окном
  • Почему я не могу создать стиль DataGridTextColumn?
  • Как визуализировать формулу в WPF или WinForms
  • Какая структура MVVM - лучшая структура для приложений WPF
  • Методология программирования WPF
  • Отключить распознавание DPI для приложения WPF
  • Являются ли "{Binding Path =.}" И "{Binding}" действительно равными
  • Давайте будем гением компьютера.