【问题标题】:How does WPF INotifyPropertyChanged work?WPF INotifyPropertyChanged 如何工作?
【发布时间】: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的绑定都会被通知更新自己。

  • 这个调用如何激活&lt;TextBlock Text="{Binding Path=CheckBoxState, Mode=TwoWay}" /&gt;?使之成为可能的 C# 的魔力是什么?
  • 为什么需要if (PropertyChanged != null)?谁将 PropertyChanged 设置为什么值?
  • Mode=TwoWay的意思好像它不仅可以发出变化的信号,还可以在绑定中其他同名的Binding元素发生变化时更新内容,那么OneWay模式呢?我们可以将绑定设置为仅源还是仅目标?

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    这个调用是如何激活的? C#背后的魔力是什么 这使它成为可能?

    这段代码创建了一个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

    【讨论】:

    • 我相信还有一种 OneTime 绑定模式,在控件加载时只更新一次。
    • @Yuf:好点:我会把它添加到我的答案中。
    • 这条线是如何工作的——PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    • 你所做的只是你评论了他的问题,没有一个真正的解释。
    猜你喜欢
    • 2021-09-07
    • 2016-12-19
    • 1970-01-01
    • 1970-01-01
    • 2011-12-17
    • 2010-10-04
    • 2011-12-25
    相关资源
    最近更新 更多