【发布时间】:2011-10-10 23:31:51
【问题描述】:
这是在 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));
}
}
}
}
我还有一个绑定到CheckBoxState 的XAML 代码。
<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,所以每个与路径CheckBoxState的绑定都会被通知更新自己。
- 这个调用如何激活
<TextBlock Text="{Binding Path=CheckBoxState, Mode=TwoWay}" />?使之成为可能的 C# 的魔力是什么? - 为什么需要
if (PropertyChanged != null)?谁将 PropertyChanged 设置为什么值? -
Mode=TwoWay的意思好像它不仅可以发出变化的信号,还可以在绑定中其他同名的Binding元素发生变化时更新内容,那么OneWay模式呢?我们可以将绑定设置为仅源还是仅目标?
【问题讨论】: