2011-09-16 30 views
6

我有以下代码,它工作正常。如何分配INotifyPropertyChanged的PropertyChanged事件?

public partial class MainWindow : Window 
{ 
    Person person; 

    public MainWindow() 
    { 
     InitializeComponent(); 

     person = new Person { Name = "ABC" }; 

     this.DataContext = person; 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     person.Name = "XYZ"; 
    } 
} 

class Person: INotifyPropertyChanged 
{ 
    string name; 

    public string Name 
    { 
     get 
     { 
      return name; 
     } 
     set 
     { 
      name = value; 
      OnPropertyChanged("Name"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged(string strPropertyName) 
    { 
     if(null != PropertyChanged) 
     { 
      PropertyChanged(this, 
          new PropertyChangedEventArgs(strPropertyName)); 
     }   
    } 
} 

当我创建的主窗口的构造函数中的“人”的对象,它会为分配的人“名称”属性的值,到时候PropertyChanged事件是NULL

如果在Button_Click事件中分配了相同的“人物”类属性“名称”,“PropertyChanged”事件是NOT NULL并且它指向OnPropertyChanged。

我的问题是如何将“PropertyChanged”事件分配给OnPropertyChanged方法?

在此先感谢。

+0

你应该真的把你的onpropertychanged做成var handler = PropertyChanged; if(null!= handler)handler(this,new PropertyChangedEventArgs(strPropertyName)'this will help you avoid a race condition –

回答

5

当您将该对象设置为DataContext时,WPF数据绑定基础结构将添加一个PropertyChanged处理程序,以检测对属性所做的更改。
您可以通过setting a breakpoint观看此事。

它指向的OnPropertyChanged方法是一个内部WPF方法,您可以通过检查代理的Target属性来看到。

2

该事件将为空,直到有东西订阅它为止。当按钮点击事件发生时,它有一个用户(通过数据绑定系统)。

+0

感谢您的回答,但它正在与SLaks答案签订。我很困惑这是正确的吗? – Syed

+1

@Syed :他并没有与我矛盾,他只是提供了更少的细节,直到WPF订阅事件(当你绑定到模型时),它就是'null'。 – SLaks

+1

另一种说法是我的答案更简洁。开玩笑,SLaks答案解释得更好。 –

相关问题