2011-09-01 73 views
1

當我有一個實現INotifyPropertyChanged的類時,可以將實現公開爲公共方法嗎?例如,如果我在類上有一個名爲「Sum」的屬性,並且我想要在UI中單擊一個按鈕來更新總和,那麼執行此操作的最佳方法是什麼?INotifyPropertyChanged最佳實踐

下面是一些僞代碼來說明我的意思

classinstance.NotifyPropertyChanged("Sum"); 
... 
public Sum { 
    get { return x + y + z; } 
} 

回答

1

.NET中的引發事件的方法,優選的做法是,要聲明的方法的保護,它只能被稱爲派生類(這是因爲只有聲明該事件的類才能引發它)。爲了從派生類中提升事件,需要一個方法來引發事件)。

例如...

protected void OnPropertyChanged(string propertyName) 
{ 
    var handler = this.PropertyChanged; 
    if (handler != null) 
    { 
     handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

此方法然後通過在屬性setter的類(或派生類)稱爲以指示屬性已經改變,像這樣...

public object MyProperty 
{ 
    get { return _myProperty; } 
    set 
    { 
     _myProperty = value; 
     OnPropertyChanged("MyProperty"); 
    } 
} 

其他對象可以訂閱此事件,並且每次MyProperty屬性發生更改時都會收到通知。

現在,回答您的問題,OnPropertyChanged方法是否可以公開。答案是肯定的,但你應該問自己爲什麼會這樣。

爲什麼另一個類會知道屬性何時發生變化,以便它可以調用該方法?如果它已經「知道」該房產何時發生了變化,那麼你應該不需要首先訂閱房地產改變的事件!只有班級本身應該「知道」自己的某個特性何時發生變化。

在您的示例中您正在通知屬性「總和」已更改。但它沒有。事實上,你的代碼甚至不允許該屬性在其自己的類之外進行更改。

我懷疑,也許你想通過某種方式通知sum屬性需要重新評估,因爲依賴屬性已被更改。如果是這種情況,那麼當該屬性發生更改時,您需要引發屬性更改事件。

試想一下,改變先前顯示的也是「myProperty的」屬性意味着「點心」已經改變,那麼將這樣的處理:

// This property is used by the 'sum' property so if this changes 
// clients need to know that 'sum' has also changed. 
public object MyProperty 
{ 
    get { return _myProperty; } 
    set 
    { 
     _myProperty = value; 
     OnPropertyChanged("MyProperty"); 
     OnPropertyChanged("Sum"); 
    } 
}