1

我在 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 被触发,但我的处理程序从未被调用。在这个问题上,我一直在用头撞墙几个小时,感谢您的帮助。

4

1 回答 1

1

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

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

在 Visual Studio 中,当第一个断点被命中时,在变量引用的实例上创建一个对象 ID 。node让您的应用程序继续执行。

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

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

于 2012-08-07T19:52:14.293 回答