2013-05-20 28 views
2

我已經實現了INotifyPropertyChanged接口一個簡單的WPF視圖查看模型,當我打電話給我的的PropertyChanged方法分配

protected void RaisePropertyChanged(string propertyName) 
{ 
    if (PropertyChanged != null) 
    { 
     PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

上GoodText的一套像

this.RaisePropertyChanged("GoodText"); 

PropertyChanged事件有一個方法是我從來沒有分配過它。

它什麼時候被分配?誰幹的?

編輯:

謝謝您,偉大的建議,但我認爲威廉的回答是什麼,我正在尋找,我的意思是:當我說

<Button Content="Button" Command="{Binding CheckButtonCommand}" /> 

這有點像(醜陋的僞代碼)

PropertyChanged += Button.GiveMeThePropertyValue; 

? 所以綁定添加了處理程序到PropertyChanged事件?

+0

正確。該綁定添加了處理程序,因此可以通知更新,並據此採取行動。這是MVVM綁定的工作方式。被綁定的對象只需要知道INotifyPropertyChanged以獲取更新通知(和/或針對集合更新的INotifyCollectionChanged)。 –

回答

1

最有可能的是,財產(一因此該類)是在XAML中(或通過代碼)綁定的數據。

如果您綁定到實現INotifyPropertyChanged的類,則綁定到源類的UIElement將連接一個事件處理程序,以便能夠監視屬性更改。

1

這是「野外活動」的魅力和代表們的魔力。

首先是場外事件:對於外部呼叫者,它們看起來像是event - 帶有add/remove訪問器;它們只能與+=/-=一起使用。但是,對於聲明類型,它們看起來更像是一個字段 - 因此您可以直接訪問委託。包括閱讀和分配值。

至於方法來自何處。這是(某種)什麼是代表。這實際上是代表實例上的.Invoke(...);但是.Invoke是隱含的。出現這種情況的任何一名代表,例如:

Action<string> action = s => Console.WriteLine(s); 
// following are identical (but with different values, obviously) 
action("hello"); 
action.Invoke("world"); 

一對夫婦的建議,但:

1:有一個真的很小unlikley到咬你此刻的線程比賽;我建議:

var handler = PropertyChanged; 
if(handler != null) handler(this, ...); 

2:最近的編譯器,可避免字面:

protected void RaisePropertyChanged([CallerMemberName] string propertyName=null) 
{ 
    var handler = PropertyChanged; 
    if (handler != null) 
    { 
     handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

,它允許你將其從GoodText屬性只需要調用爲:

this.RaisePropertyChanged(); 

減代碼=更少的東西出錯(複製/粘貼名稱等)