也許這裏已經是這樣的問題,但我沒有找到它。在setter中自訂的PropertyChanged或添加方法調用?
我有MVVM應用程序,在我的ViewModel
我必須做一些更改某些屬性的其他操作(例如,如果View
更改它們)。你認爲哪種方法更好,爲什麼?
1日 - 添加AdditionalAction
呼叫設定器
public class ViewModel: INotifyPropertyChanged
{
private int _MyProperty;
public int MyProperty
{
get { return _MyProperty; }
set
{
if (_MyProperty == value) return;
_MyProperty = value;
RaisePropertyChanged(() => MyProperty);
// --- ADDITIONAL CODE ---
AdditionalAction();
}
}
}
2日 - 自訂閱INotifyPropertyChanged的
public class ViewModel: INotifyPropertyChanged
{
public ViewModel()
{
// --- ADDITIONAL CODE ---
PropertyChanged += OnPropertyChanged;
}
private int _MyProperty;
public int MyProperty
{
get { return _MyProperty; }
set
{
if (_MyProperty == value) return;
_MyProperty = value;
RaisePropertyChanged(() => MyProperty);
}
}
void PropertyChanged(object sender, PropertyChangedEventArgs e)
{
// --- ADDITIONAL CODE ---
if (e.PropertyName == "MyProperty")
AdditionalAction();
}
}
想象一下,我沒有性能問題或10'000個物體。這只是View和ViewModel。什麼是更好的?第一個代碼是「更小」,開銷更少,但第二個代碼更清晰,我可以使用代碼片段來自動生成代碼。甚至更多 - 在第二個情況下,我可以在事件處理程序像寫:
On.PropertyChanged(e, p => p.MyProperty, AdditionalAction);
其中On
類是輔助性。
那麼,你心目中的什麼更好,爲什麼?
更新:
OK,它看起來像我發現還沒有一種方法:
3日 - 在RaisePropertyChanged加上 「擴展點」:
public class NotificationObject : INotifyPropertyChanged
{
void RaisePropertyChanged(Expression<...> property)
{
// ... Raise PropertyChanged event
if (PropertyChanged != null)
// blah-blah
// Call extension point
OnPropertyChanged(property.Name);
}
public virtual OnPropertyChanged(string propertyName)
{
}
}
public class ViewModel: NotificationObject
{
private int _MyProperty;
public int MyProperty
{
get { return _MyProperty; }
set
{
if (_MyProperty == value) return;
_MyProperty = value;
RaisePropertyChanged(() => MyProperty);
}
}
override OnPropertyChanged(string propertyName)
{
if (propertyName == "MyProperty")
AdditionalAction();
}
}
這樣我們不使用事件,但所有「附加動作」都是從相同的「擴展點」調用的。是「所有添加行爲的一個地方」比「不透明的工作流程」更好嗎?
http://tergiver.wordpress.com/2011/01/20/self-subscription-is-asinine/ – Tergiver
旁註:考慮使用一個輔助方法把你的屬性的setter三線之一,如果屬性確實改變,則返回一個布爾值。更短,沒有重複。例如'if(RaisePropertyChanged(ref _MyProperty,value,o => o.MyProperty))AdditionalAction();' – stijn
@Tergiver你的方式和我的第二種方式有什麼不同?它們是相同的 - 你不在「setter」中編寫額外的代碼,而是在「事件處理程序」中編寫 - 從這個角度來看,「OnXXX」方法與自定義事件相同。所以,從你的角度來看,我的問題是 - 「從setter或OnPropertyChanged方法調用'AdditionalAction'更好嗎?」 (即使實際上沒有方法OnPropertyChanged) – chopikadze