【问题标题】:What is the importance of RaisePropertyChanged?RaisePropertyChanged 的​​重要性是什么?
【发布时间】:2014-08-25 02:05:21
【问题描述】:

我目前正在学习 MVVM,但我不明白 RaisePropertyChanged 有多重要

例如这个函数:

public City SelectedCity
{
    get
    {
        return selectedcity;
    }
    set
    {
        RaisePropertyChanging(SelectedCityLocationPropertyName);
        selectedtrend = value;
        RaisePropertyChanged(SelectedCityLocationPropertyName);
        MessageBox.Show(City.Name);
    }
}

还有这个:

public City SelectedCity
{
    get
    {
        return selectedcity;
    }
    set
    {
        //   RaisePropertyChanging(SelectedCityLocationPropertyName);
        selectedtrend = value;
        //   RaisePropertyChanged(SelectedCityLocationPropertyName);
        MessageBox.Show(City.Name);
    }
}

给我完全相同的结果。你能告诉我为什么RaisePropertyChanged 如此重要,并给我一个例子,它会产生重大影响吗?

【问题讨论】:

  • 你读过数据绑定吗?
  • 是的,我熟悉 DataBinding
  • MessageBox 绝不是任何指示,只能干扰该属性的正常运行。

标签: c# .net mvvm mvvm-light


【解决方案1】:

阅读:

http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx

RaisePropertyChanging 事件用于通知 UI 或绑定元素数据已更改。例如,TextBox 需要在底层数据更改时收到通知,以便它可以更新您在 UI 中看到的文本。如果没有NotifyPropertyChanged 事件,TextBox 将不知道数据发生了变化。

这在 MVVM 中非常重要。

【讨论】:

    【解决方案2】:

    RaisePropertyChange 是向订阅该类的人发出属性状态变化信号的事件。如果您查看 MVVM light 中的基类,您会发现它遵循INotifyPropertyChanged

    当属性通知订阅者发生更改(很可能是 Xaml 中的绑定)时,事件的使用者知道用新数据更新控件。这允许视图异步更新,而无需直接更新任何绑定控件。

    请参阅我对MVVM update of calculated properties 的回答,了解可以使用INotifyPropertyChange 推送更新的示例。

    在我的博客上,我还讨论了 MVVM 绑定(MVVM 灯只是一个包装器)Xaml: ViewModel Main Page Instantiation and Loading Strategy for Easier Binding.,它可能会向您展示它是如何在没有 MVVM 灯助手包装器的情况下完成的。

    【讨论】:

      【解决方案3】:

      WPF 绑定机制依赖于每个 FrameworkElementDataContext 引发 PropertyChanged 事件,以便它的 Dependency Properties 对它们绑定到的普通 CLR 属性的值进行采样。

      依赖属性普通CLR属性

      加载时,每个 FrameworkElement 的依赖属性都将被赋予来自绑定 CLR 属性的值。

      Binding 引擎监听 PropertyChanged 事件, 引发时,它会找到与事件 args 中给出的名称的 CLR 属性绑定的相应依赖属性 (Properties),并从中更新它们的值(此时您将到达 CLR 属性的 getter)。

      【讨论】:

        猜你喜欢
        • 2016-09-21
        • 1970-01-01
        • 1970-01-01
        • 2017-02-02
        • 2011-01-14
        • 2011-02-21
        • 1970-01-01
        • 2011-01-03
        • 1970-01-01
        相关资源
        最近更新 更多