2011-02-10 44 views
0

我从来没有工作wuth INotifyPropertyChanged。我正在阅读文章,并从那里找到与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调用。

感谢

+0

你知道事件的一般工作原理吗? – 2011-02-10 12:48:02

回答

3

因为WPF注册到PropertyChanged事件,这将会使绑定工作,即您更改的属性和文本框的文本改变。

此外,事件引发模式是标准模式:通过受保护的方法引发事件,以便子类可以关闭/更改行为。

其实我有更多的在我的视图模型有点那个验证名称 - 最初是由约什 - 史密斯:

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); 
     } 
    } 
2

您应该检查属性setter内,如果财产实际变化,然后通过rasing您事件可以通知财产已经改变

 set 
     { 
      if (lastname != value) 
      { 
       _lastName = value; 
       RaisePropertyChanged("LastName"); 
       RaisePropertyChanged("FullName"); 
      } 
     } 

已订阅的任何类为t他PropertyChanged事件,然后会通知该属性已更改,以便他们可以更新其绑定。

+0

如果你有客户类,并有一个名为name的属性,并且当我们在创建该类的对象后从代码中更改名称,那么只是属性发生更改。在阅读了几个与INotifyPropertyChanged接口相关的代码之后,我已经看到它的好处是它调用了调用报告给它的调用环境,这个特性已经发生了变化,因此用户可以在属性更改后从事件中编写自己的代码。 – Thomas 2011-02-10 13:22:13

1

这样,所有订阅收件人都会收到一条消息,指出该属性已更改,因此应该相应地更新其值。例如,网格会改变文字。

他们更新FullName属性的原因是因为First/Last名称属性直接影响到该人员的FullName,因此绑定应反映这些值。

+0

在小样本的帮助下,请告诉我如何使用INotifyPropertyChanged接口可以获益。当属性会发生变化时,绑定会自动反映这些变化,或者是否需要编写任何代码来强制控件显示更改。谢谢 – Thomas 2011-02-10 13:16:48