这是一个典型的INotifyPropertyChanged实现,用于在WPF/C#中使用Binding。
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
。
<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>
这是用于将DataContext与模型关联的MainWindow.xaml.cs文件。
public partial class MainWindow : Window
{
notifications.ViewModel.MainViewModel model = new notifications.ViewModel.MainViewModel();
public MainWindow()
{
InitializeComponent();
this.DataContext = model;
}
}
当用户设置复选框时,我认为会发生以下操作: IsChecked
变为 true,并使用 "{Binding Path=CheckBoxState, Mode=TwoWay}"
,CheckBoxState
属性变为 true,调用 RaisePropertyChanged()
和相应的 PropertyChanged()
。由于此函数的参数是 CheckBoxState
,因此每个 Path 为 CheckBoxState
的 Binding 都会被通知以更新自身。
- 这个调用是如何激活
<TextBlock Text="{Binding Path=CheckBoxState, Mode=TwoWay}" />
的?C# 是怎么做到这一点的? if (PropertyChanged != null)
为什么是必要的?谁将 PropertyChanged 设置为什么值?Mode=TwoWay
的含义似乎不仅可以表示更改,还可以在其他绑定元素中具有相同名称的 Binding 更改时更新内容,那 OneWay 模式呢?我们可以将 Binding 设置为仅源或仅目标吗?