我有一个负责创建(和保存)新患者的表格。在此表单上,我使用 ErrorProvider 在无效字段上显示错误图标(在本例中为“LastName”)。所以,像往常一样 => errorProvider.DataSource = patient;
当我的模型使用默认的 GetHashCode() 时,一切正常。但是,当我尝试使用自定义哈希码(我想将此模型与 ISet 集合一起使用)覆盖此方法时,控件无法正常工作。现在,我知道自定义哈希码应该只用于不可变对象。但关键是,如果 ErrorProvider 行为依赖于 GetHashCode 以正常工作,我该如何填写这些对象的字段?是否有必要实现在默认哈希码(在对象初始化期间)和自定义哈希之间切换的脏机制?
代码示例:
public class Patient : IDataErrorInfo, INotifyPropertyChanged
{
public string lastName;
public virtual string LastName
{
get { return lastName; }
set
{
if (lastName == value) return;
lastName = value;
NotifyPropertyChanged("LastName");
}
}
#region IDataErrorInfo Members
string IDataErrorInfo.Error { get { return null; } }
string IDataErrorInfo.this[string propertyName]
{
get { return this.GetValidationError(propertyName); }
}
#endregion // IDataErrorInfo Members
protected string GetValidationError(string propertyName)
{
if (ValidatedProperties.IndexOf(propertyName) < 0)
return null;
string error = null;
switch (propertyName)
{
case "LastName":
if (LastName == null)
error = "null";
break;
default:
break;
}
return error;
}
public virtual event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
public override int GetHashCode()
{
unchecked
{
int result = 17;
result = 23 * result + ((LastName != null) ? LastName.GetHashCode() : 0);
return result;
}
}
}