當我有一個實現INotifyPropertyChanged的類時,可以將實現公開爲公共方法嗎?例如,如果我在類上有一個名爲「Sum」的屬性,並且我想要在UI中單擊一個按鈕來更新總和,那麼執行此操作的最佳方法是什麼?INotifyPropertyChanged最佳實踐
下面是一些僞代碼來說明我的意思
classinstance.NotifyPropertyChanged("Sum");
...
public Sum {
get { return x + y + z; }
}
當我有一個實現INotifyPropertyChanged的類時,可以將實現公開爲公共方法嗎?例如,如果我在類上有一個名爲「Sum」的屬性,並且我想要在UI中單擊一個按鈕來更新總和,那麼執行此操作的最佳方法是什麼?INotifyPropertyChanged最佳實踐
下面是一些僞代碼來說明我的意思
classinstance.NotifyPropertyChanged("Sum");
...
public Sum {
get { return x + y + z; }
}
.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");
}
}