我有一个死了从INotifyPropertyChanged
继承的简单视图模型。试图为这个视图模型创建一些自动化测试后,我最终覆盖了Equals()
和GetHashCode()
。我的测试通过了,所以我是一个快乐的露营者。为什么重写GetHashCode()块INotifyPropertyChanged?
但是,现在我的Windows窗体数据绑定没有反应,当我的视图模型中的属性发生更改时。如果我评论我的GetHashCode()
实现所有预期的工作,除了我的测试。
这是我实现:
public override int GetHashCode()
{
unchecked
{
var hashCode = (_subject != null ? _subject.GetHashCode() : 0);
hashCode = (hashCode * 397)^(_message != null ? _message.GetHashCode() : 0);
hashCode = (hashCode * 397)^
(_body != null ? _body.GetHashCode() : 0);
return hashCode;
}
}
这简直是对我产生什么ReSharper的。
为什么重写GetHashCode()
会阻止我的数据绑定拾取我的视图模型更改,尽管我调用了PropertyChanged
事件?
GetHashCode()和Equals()是否在相同的字段上运行?换句话说,如果Equals()返回true,那么HashCodes应该是相等的。你能证实情况吗? – 2013-02-13 18:59:37
我的猜测是被返回的哈希码每次都是相同的,所以.Net认为它是相同的对象,并且不会触发属性更改的事件。 – 2013-02-13 19:01:06
非常不清楚。什么数据绑定?用于WinForms的ViewModels?为什么测试需要GetHashcode? – 2013-02-13 19:03:49