Как работает WPF INotifyPropertyChanged? - PullRequest
24 голосов
/ 22 июля 2011

Это типичная реализация 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. enter image description here

<Grid>
    <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
        <CheckBox Content="Click Me" IsChecked="{Binding Path=CheckBoxState, Mode=TwoWay}" />
        <TextBlock Text="{Binding Path=CheckBoxState, Mode=TwoWay}" />
    </StackPanel>
</Grid>

Это 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 with Path CheckBoxState уведомляется об обновлении.

  • Как активируется этот звонок <TextBlock Text="{Binding Path=CheckBoxState, Mode=TwoWay}" />? В чем суть C #, чтобы сделать это возможным?
  • Почему if (PropertyChanged != null) необходимо? Кто устанавливает PropertyChanged на какое значение?
  • Значение Mode=TwoWay выглядит так, что оно не только может сигнализировать об изменении, но и обновляет содержимое, когда изменяется другой элемент Binding с таким же именем в привязке, тогда как насчет режима OneWay? Можем ли мы установить привязку только в качестве источника или цели?

1 Ответ

19 голосов
/ 22 июля 2011

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

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

Почему 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

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