2011-09-16 52 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答案解釋得更好。 –

相關問題