【问题标题】:INotifyPropertyChanged Event Not Calling Event HandlerINotifyPropertyChanged 事件未调用事件处理程序
【发布时间】:2012-08-07 16:27:41
【问题描述】:

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

首先,我附加了事件处理程序。我逐步完成了这个,并注意到在添加事件处理程序之后,PropertyChanged 不再为空,但是,它的 invocationCount 仍然是 0,它的 invocationList 仍然是空的。没想到吧?

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

接下来,我更改一个属性,并调用我的 OnPropertyChanged 方法,如下所示:

OnPropertyChanged("CheckState");

触发方法。我逐步完成,在检查 PropertyChanged 事件时,它不是预期的 NULL,但是它的 invocationCount 为 3,并且 invocationList 有 4 个对象,其中最后一个是 NULL。这对我来说毫无意义,应该只有之前分配的 1 个处理程序。相反,它是其他一些列表,并且不包括我的原始处理程序。

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

因此,PropertyChanged 被触发,但我的处理程序从未被调用。在这个问题上,我已经用头撞墙了几个小时,感谢您提供任何帮助。

【问题讨论】:

  • 您是否更改了正确节点实例的“CheckState”属性?
  • 是的,它应该是正确的实例,添加处理程序实际上是在一个循环中,所以所有实例都附加了。
  • “应该是正确的实例”听起来好像不是。 Make an object IDnode,然后在OnPropertyChanged 中检查。
  • 为了测试,您可以在注册事件后在下一行更改“CheckState”属性。
  • @Will,感谢您的提示,看起来它们确实是单独的实例。至于为什么......我想这是另一个问题,但至少让我确认它们是单独的实例。

标签: c# silverlight mvvm inotifypropertychanged


【解决方案1】:

问题中显示的代码没有任何问题。这表明 1)您的代码与此处表示的不同,或者 2)您在第一部分中添加侦听器的实例不是您正在触发 OnPropertyChanged 的实例。 2号是我的赌注。

为了对此进行测试,您应该调试您的应用程序,在您添加侦听器的位置以及您正在触发OnPropertyChanged 的位置放置一个断点。

在 Visual Studio 中,当第一个断点被击中时,make an object ID 位于 node 变量引用的实例上。让您的应用程序继续执行。

OnPropertyChanged 中的第二个断点命中时,检查this 上的对象ID。你会发现实例是否相同。

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

【讨论】:

  • 谢谢@Will,我用它来追溯收藏藏品的财产。似乎另一个开发人员编写它是为了创建深层副本,而不是简单地返回单个实例。我已经解决了我的问题,并且能够证明它们是单独的实例是关键。
  • “制作对象 ID”链接已失效;有人可以解释一下怎么做吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-24
  • 2023-03-11
  • 2015-12-18
  • 1970-01-01
相关资源
最近更新 更多