这是在 WPF/C# 中使用绑定的典型 INotifyPropertyChanged 实现。
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));
}
}
}
}
I also have a XAML code that has a binding to 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
变为真,并且与"{Binding Path=CheckBoxState, Mode=TwoWay}"
, CheckBoxState
属性变为真实调用RaisePropertyChanged()
并相应地PropertyChanged()
。由于该函数的参数是CheckBoxState
, 每个与 Path 的绑定CheckBoxState
被通知自行更新。
- 这个呼叫如何激活
<TextBlock Text="{Binding Path=CheckBoxState, Mode=TwoWay}" />
? C# 有何魔力让这一切成为可能?
- Why is
if (PropertyChanged != null)
必要的?谁将 PropertyChanged 设置为什么值?
- 的含义
Mode=TwoWay
看起来它不仅可以发出变化信号,而且当绑定中其他同名的Binding元素发生变化时也会更新内容,那么OneWay模式呢?我们可以将绑定设置为仅源或仅目标吗?