ViewModelBase
にカプセル化されたコア機能があります
次に、PropertyChangedイベントがViewModelBaseによっていつ発生し、それに基づいて動作するかを確認します。たとえば、ViewModelBaseで1つのプロパティが変更された場合、ViewModelでプロパティを変更したい
どうすればこれを達成できますか?
public class MaintainGroupViewModel : BaseViewModel<MEMGroup>
{
public abstract class BaseViewModel<T> : NotificationObject, INavigationAware
where T : Entity
{
派生クラスのプロパティを基本クラスの値(同様に悪い)に効果的に「手動バインディング」(悪い)していることを心配しています。継承を使用する重要な点は、派生クラスが基本クラスのオブジェクトにアクセスできることです。 protected
修飾子を使用して、派生クラスだけがアクセスできるようにする必要があることを示します。
私はこれを(潜在的に)より正しい方法を提案します:
基本クラス:
protected virtual void OnMyValueChanged() { }
派生クラス:
protected override void OnMyValueChanged() { /* respond here */ }
本当に、あなたが書いているクラスそのものの基本クラスのイベントにサブスクライブすることは、信じられないほど逆に思えます。あなたは文字通り、何かが起こったときにオブジェクトに自分自身を告げるように求めています。メソッド呼び出しは、そのために使用する必要があるものです。
"ViewModelBaseで1つのプロパティが変更されたとき-私のViewModelでプロパティを変更したい"の観点では、同じオブジェクトです!
通常、クラスコンストラクターのPropertyChanged
イベントへのレジスターを使用します
public MyViewModel()
{
this.PropertyChanged += MyViewModel_PropertyChanged;
}
そして、私のPropertyChangedイベントハンドラーは次のようになります。
void MyViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
switch (e.PropertyName)
{
case "SomeProperty":
// Do something
break;
}
}
プロパティの変更をサブスクライブする直接的な方法は、INotifyPropertyChanged
がそれを実装している場合は BaseViewModel
を使用することです。
PropertyChanged += (obj, args) =>
{ System.Console.WriteLine("Property " + args.PropertyName + " changed"); }
そうでない場合は、DependencyObject
である必要があり、プロパティはDependencyProperties
である必要があります(これはおそらくより複雑な方法です)。
この記事 は、DependencyProperty
の変更をサブスクライブする方法を説明しています。