C# WPF INotifyPropertyChanged如何工作?

C# WPF INotifyPropertyChanged如何工作?,c#,wpf,C#,Wpf,这是在WPF/C#中使用绑定的典型INotifyPropertyChanged实现 我还有一个绑定到CheckBoxState的XAML代码 <Grid> <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center"> <CheckBox Content="Click Me" IsChecked="{Binding Path=CheckBoxState, Mode=Tw

这是在WPF/C#中使用绑定的典型INotifyPropertyChanged实现

我还有一个绑定到
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>
当用户设置复选框时,我认为会发生如下情况:
IsChecked
变为true,并且随着
“{Binding Path=CheckBoxState,Mode=TwoWay}”
CheckBoxState
属性变为true以调用
RaisePropertyChanged()
。由于此函数的参数是
CheckBoxState
,因此会通知每个具有路径
CheckBoxState
的绑定进行自我更新

  • 此调用如何激活
    ?这背后的C#的魔力是什么
  • 如果(PropertyChanged!=null)有必要,为什么
    ?谁设置的属性更改为什么值
    
  • Mode=TwoWay
    的意思是,它不仅可以发出更改的信号,还可以在绑定中具有相同名称的其他绑定元素更改时更新内容,那么单向模式呢?我们可以将绑定设置为仅源还是仅目标
这个电话是如何激活的?C#背后的魔力是什么 这是为了让它成为可能吗

此代码创建一个
绑定
对象,该对象将TextBlock的文本属性链接到ViewModel属性。它还将事件处理程序添加到ViewModel的PropertyChanged事件中,以在ViewModel触发PropertyChanged事件(使用right属性)时更新文本值

如果(PropertyChanged!=null)
有必要,为什么
?谁设立了
物业的价值是多少

如果PropertyChanged事件为null,则触发它将导致NullReferenceException

Mode=TwoWay
的含义似乎是它不仅可以向 更改,但在使用其他绑定元素时也会更新内容 绑定中的相同名称发生了变化,那么单向模式呢?我们可以吗 将绑定设置为仅源还是仅目标

绑定模式为:

  • 双向:当ViewModel属性更改时更改绑定值,反之亦然
  • 单向:仅当ViewModel属性更改时更改绑定值
  • OneWayToSource:仅当绑定值更改时才更改ViewModel属性
  • OneTime:仅当创建应用程序或数据上下文更改时,将绑定值设置为ViewModel属性的值

您可以在此处了解更多信息:

我相信还有一种一次性绑定模式,在加载控件时只更新一次。@Yuf:好的地方:我将把它添加到我的答案中。这一行是如何工作的--PropertyChanged(这是新的PropertyChangedEventArgs(propertyName));
<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>
public partial class MainWindow : Window
{
    notifications.ViewModel.MainViewModel model = new notifications.ViewModel.MainViewModel();

    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = model;
    }
}