我从来没有和INotifyPropertyChanged合作过。我正在读一篇文章,从中我找到了与INotifyPropertyChanged相关的代码。
public class ContactModel : INotifyPropertyChanged
{
private string _firstName;
public string FirstName
{
get { return _firstName; }
set
{
_firstName = value;
RaisePropertyChanged("FirstName");
RaisePropertyChanged("FullName");
}
}
private string _lastName;
public string LastName
{
get { return _lastName; }
set
{
_lastName = value;
RaisePropertyChanged("LastName");
RaisePropertyChanged("FullName");
}
}
public string FullName
{
get { return string.Format("{0} {1}", FirstName, LastName); }
}
protected void RaisePropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
public event PropertyChangedEventHandler PropertyChanged;
public override bool Equals(object obj)
{
return obj is ContactModel && ((ContactModel) obj).FullName.Equals(FullName);
}
public override int GetHashCode()
{
return FullName.GetHashCode();
}
}从上面的代码中我发现RaisePropertyChanged("FirstName");总是从属性设置器中调用。为什么需要调用RaisePropertyChanged。我在谷歌上搜索很好的解释,但我没有找到任何好的链接。所以如果有人解释为什么RaisePropertyChanged需要从setter调用,请解释一下。
谢谢
发布于 2011-02-10 20:46:04
因为WPF注册到PropertyChanged事件,这将使绑定工作,即,您更改属性和文本框文本更改。
事件引发模式也是一个标准的模式:事件是通过一个受保护的方法引发的,这样子类就可以关闭它/或者改变行为。
实际上,我在我的视图模型上有更多关于验证名称的信息-最初是由Josh Smith编写的:
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
VerifyPropertyName(propertyName);
PropertyChangedEventHandler handler = this.PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
protected void OnPropertyChanged(object sender, string propertyName)
{
PropertyChanged(sender, new PropertyChangedEventArgs(propertyName));
}
public void VerifyPropertyName(string propertyName)
{
if (TypeDescriptor.GetProperties(this)[propertyName] == null)
{
throw new Exception("Invalid property name: " + propertyName);
}
}发布于 2011-02-10 20:47:47
您应该在属性设置器中检查属性是否实际更改,然后通过引发事件,您可以通知您的属性已经更改了
set
{
if (lastname != value)
{
_lastName = value;
RaisePropertyChanged("LastName");
RaisePropertyChanged("FullName");
}
}然后,任何订阅了PropertyChanged事件的类都将被通知该属性已更改,以便它们可以更新其绑定。
发布于 2011-02-10 20:47:57
这是为了让所有订阅收件人都收到一条消息,说明属性已更改,因此他们应该相应地更新它们的值。例如,网格将更改文本。
他们更新FullName属性的原因也是因为First/Last name属性直接影响person的FullName,因此绑定应该反映这些值。
https://stackoverflow.com/questions/4957235
复制相似问题