首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解INotifyPropertyChanged

理解INotifyPropertyChanged
EN

Stack Overflow用户
提问于 2014-06-19 14:55:37
回答 2查看 760关注 0票数 1

当我们实现INotifyPropertyChanged时,它会通知什么?

它是只通知视图(我怀疑它),还是每个具有名称的属性(可能会提供不必要的影响)。或者仅仅是存在于DataContext中的属性(由于模型中可能没有DataContext ),这是值得怀疑的。

有没有可能有这样的一个函数

代码语言:javascript
复制
public class Demo : BaseViewModel
{
    public void UpdateAll()
    {
        //Update properties which do not exist in this class
        OnPropertyChanged("NameFromClassA");
        OnPropertyChanged("NameFromClassB");
        OnPropertyChanged("AgeInClassA");
        OnPropertyChanged("AgeInClassC");
    }
}

我试过了,但我不能让它起作用。输出窗口中没有绑定错误,也没有任何运行时/编译器问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-19 15:02:48

INotifyPropertyChanged接口用于通知客户端(通常是绑定客户端)属性值已更改。

OnPropertyChanged("NameFromClassA")通常在BaseViewModel Class中实现,相当于执行:

代码语言:javascript
复制
    if (this.PropertyChanged != null)
      this.PropertyChanged(this, new PropertyChangedEventArgs("NameFromClassA"));

它告诉正在收听Demo ClassPropertyChanged事件的人,名为"NameFromClassA“的Property已经更改了值(您的示例是错误的,因为您的Class中没有这样的Property )。

DependencyProperties绑定到VM的Properties以更新自身是必需的,很少用于其他任何事情。

编辑:

Psoeudo-大致相当于绑定引擎在场景后面所做工作的代码:

代码语言:javascript
复制
ClassA myClassA;
string myPropertyBoundToNameOfClassA;

// somewhere after myClassA was initialized
myClassA.PropertyChanged += OnMyClassAPropertyChanged;

void MyClassAPropertyChanged(string name)
{
   if (name == "NameFromClassA")
       myPropertyBoundToNameOfClassA = myClassA.Name;
}
票数 1
EN

Stack Overflow用户

发布于 2014-06-19 15:00:34

INotifyPropertyChanged接口用于通知客户端(通常是绑定客户端)属性值已更改。

例如,考虑具有名为FirstName的属性的Person对象。要提供通用属性更改通知,Person类型实现INotifyPropertyChanged接口,并在更改PropertyChanged事件时引发FirstName事件。

要使更改通知发生在绑定客户端和数据源之间的绑定中,绑定类型应该是:实现INotifyPropertyChanged接口(首选)。为绑定类型的每个属性提供一个更改事件。

有关示例程序,请检查以下代码:MSDN

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24309677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档