Как работает WPF INotifyPropertyChanged?
Это типичная реализация INotifyPropertyChanged для использования Binding в WPF/С#.
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 с Path CheckBoxState
уведомляется об обновлении.
- Как этот вызов активирует
<TextBlock Text="{Binding Path=CheckBoxState, Mode=TwoWay}" />
? Что такое С# магия за это, чтобы это стало возможным?
- Зачем нужен
if (PropertyChanged != null)
? Кто настраивает PropertyChanged на какое значение?
- Значение
Mode=TwoWay
выглядит так, что он может не только сигнализировать об изменении, но также обновлять содержимое, когда другой элемент Binding с тем же именем в привязке меняется, а что же в режиме OneWay? Можем ли мы установить привязку только как источник или цель?
Ответы
Ответ 1
Как активируется этот вызов? Что такое магия С# это сделать возможным?
Этот код создает объект Binding
, который связывает свойство TextBlock Text с свойством ViewModel. Он также добавляет обработчик события в событие ViewModel PropertyChanged для обновления текстового значения, когда ViewModel запускает событие PropertyChanged (с правом свойства).
Почему if (PropertyChanged != null)
необходимо? Кто создает СвойствоИзменено какое значение?
Если событие 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