我刚刚开始学习 MVVM 和 WPF,很抱歉提出了愚蠢的问题。
我正在使用不同的教程和示例来学习,并且我遇到了这个例子 http://www.codeproject.com/Articles/165368/WPF-MVVM-Quick-Start-Tutorial(阅读示例2)我不明白。
private void RaisePropertyChanged(string propertyName)
{
// take a copy to prevent thread issues
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
基本上,该评论对我来说没有多大意义...“复制一份以防止线程问题”。
这行:
PropertyChangedEventHandler handler = PropertyChanged;
不会创造一个新的、完全不同的handler
对象(它不是克隆的)。这只是对相同内容的新引用PropertyChanged
对象,对吗?
我做了一些测试来了解到底发生了什么:
PropertyChangedEventHandler handler = PropertyChanged;
var message = "PropertyChanged: " + PropertyChanged.GetHashCode() + "\n";
message += "handler: " + handler.GetHashCode() + "\n";
message += "are equal (1): " + (PropertyChanged.Equals(handler)) + "\n";
message += "are equal (2): " + (PropertyChanged == handler) + "\n";
MessageBox.Show(message);
结果如下:
这证实了我的理论这两个对象确实是相同的作业只是一个NOOP. 我不明白的是,这与“线程问题”(来自评论)有什么关系?!?
还有一件事:经过一些测试(使用一个非常简单的例子),我发现PropertyChanged
事件是永不为空. 为什么我们需要空检查?
在我看来,之前的方法可以简化为:
private void RaisePropertyChanged(string propertyName)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
我测试了一下(再次,在一个非常简单的例子上)并且它似乎效果很好... 有什么问题或者我没有找到的东西吗?也许我只是发现了不好的例子?
无论如何,有很多东西我不知道,因为正如我所说,我刚刚开始学习 WPF 和 MVVM,但是我想了解到底发生了什么,而不仅仅是拿一些代码然后粘贴它而不理解它为什么以及如何工作。看货物崇拜编程 http://en.wikipedia.org/wiki/Cargo_cult_programming and 魔法编程 http://en.wikipedia.org/wiki/Magic_%28programming%29.
EDIT
好的,根据答案,PropertyChanged
event 可以改变验证和调用之间。更多的是,PropertyChanged
event 可以为空. However,我没能做到复制这些行为...
有人可以给我一个例子,这两种说法都发生吗?这肯定有助于识别类似的情况。