多分ここにそのような質問がありますが、私はそれを見つけられませんでした。
私はMVVMアプリケーションをViewModel
持っており、いくつかのプロパティの変更に対して追加のアクションを実行する必要があります(たとえば、View
それらを変更する場合)。どちらのアプローチがあなたにとってより良いと思いますか?またその理由は何ですか?
1st -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 だけです。何が良いですか?最初のコードは「小さく」なり、オーバーヘッドが少なくなりますが、2 番目のコード (私の考えでは) はより明確になり、自動生成プロパティのコードにコード スニペットを使用できます。さらに-2番目のケースでは、イベントハンドラーに次のようなものを書くことができます:
On.PropertyChanged(e, p => p.MyProperty, AdditionalAction);
On
クラスヘルパーはどこですか。
それで、あなたの心には何が良いですか、そしてその理由は何ですか?
更新しました:
OK、まだ1つのアプローチを見つけたようです:
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();
}
}
この方法ではイベントを使用しませんが、すべての「追加アクション」は同じ「拡張ポイント」から呼び出されます。「透明でないワークフロー」よりも「すべての追加アクションを 1 か所で」の方がよいですか?