INotifyPropertyChanged事件没有调用事件处理程序

问题描述:

我在SL 4.0中做了一点MVVM工作,并且我有一个事件处理程序,永远不会被调用,尽管事件触发,并且是非空的。INotifyPropertyChanged事件没有调用事件处理程序

首先,我附加了事件处理程序。我介绍了这一点,并注意到在添加事件处理程序后,该PropertyChanged不再为null,但是它的invocationCount仍然为0,它的invocationList仍然为空。这不是正确的?

node.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(OnMonitoredDataSourceNodePropertyChanged); 

接下来,我更改属性,并叫我OnPropertyChanged方法,像这样:

OnPropertyChanged("CheckState"); 

时触发的方法。我逐步了解了这一点,并且在检查PropertyChanged事件时,它是预期的NOT NULL,但它具有3的invocationCount,并且invocationList有4个对象,最后一个是NULL。这对我来说没有意义,应该只有以前分配的1个处理程序。相反,它的一些其他名单,并没有包括我原来的处理程序。

public void OnPropertyChanged(string propertyName) { 
     if (this.PropertyChanged != null) { 
      this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

因此,PropertyChanged被触发,但我的处理程序永远不会被调用。我一直在这块墙上敲打我的头几个小时,任何帮助表示赞赏。

+0

您是否更改了正确节点实例的“CheckState”属性? – Andre 2012-08-07 16:40:34

+0

是的,它应该是正确的实例,添加处理程序实际上是在一个循环中,因此所有实例都被连接。 “ – 2012-08-07 17:14:12

+1

”应该是正确的实例“听起来好像不是。 [为节点创建对象ID](http://blogs.msdn.com/b/zainnab/archive/2010/03/04/make-objectid-vstipdebug0015.aspx),然后在'OnPropertyChanged'中检查它。 – Will 2012-08-07 19:01:08

代码出现在问题中没有任何问题。它会建议1)你的代码不像这里所表示的那样,或者2)你在第一部分中添加侦听器的实例不是你正在触发OnPropertyChanged的实例。 2号是我的赌注。

为了测试这个,你应该调试你的应用程序,在添加一个监听器的地方放置一个断点,以及你在哪里发射OnPropertyChanged

在Visual Studio中,当第一个断点被击中时,make an object IDnode变量所引用的实例。让你的应用程序继续执行。

当第二个断点碰到OnPropertyChanged时,请检查this上的对象ID。你会发现这些实例是否相同。

在所有调试中,确定你的假设是什么。因为这就是你的错误所在。

+0

谢谢@威尔,我用它来追溯到持有集合的财产。看起来另一位开发人员编写它来创建深度副本,而不是简单地返回一个实例。我已经修复了我的问题并能够证明他们是单独的实例是关键。 – 2012-08-07 19:55:21