web-dev-qa-db-ja.com

ViewModelでPropertyChangedイベントをサブスクライブするにはどうすればよいですか?

ViewModelBaseにカプセル化されたコア機能があります

次に、PropertyChangedイベントがViewModelBaseによっていつ発生し、それに基づいて動作するかを確認します。たとえば、ViewModelBaseで1つのプロパティが変更された場合、ViewModelでプロパティを変更したい

どうすればこれを達成できますか?

public class MaintainGroupViewModel : BaseViewModel<MEMGroup>
    {


public abstract class BaseViewModel<T> : NotificationObject, INavigationAware
        where T : Entity
    {
20
katit

派生クラスのプロパティを基本クラスの値(同様に悪い)に効果的に「手動バインディング」(悪い)していることを心配しています。継承を使用する重要な点は、派生クラスが基本クラスのオブジェクトにアクセスできることです。 protected修飾子を使用して、派生クラスだけがアクセスできるようにする必要があることを示します。

私はこれを(潜在的に)より正しい方法を提案します:

基本クラス:

protected virtual void OnMyValueChanged() { }

派生クラス:

protected override void OnMyValueChanged() { /* respond here */ }

本当に、あなたが書いているクラスそのものの基本クラスのイベントにサブスクライブすることは、信じられないほど逆に思えます。あなたは文字通り、何かが起こったときにオブジェクトに自分自身を告げるように求めています。メソッド呼び出しは、そのために使用する必要があるものです。

"ViewModelBaseで1つのプロパティが変更されたとき-私のViewModelでプロパティを変更したい"の観点では、同じオブジェクトです!

11

通常、クラスコンストラクターのPropertyChangedイベントへのレジスターを使用します

public MyViewModel()
{
    this.PropertyChanged += MyViewModel_PropertyChanged;
}

そして、私のPropertyChangedイベントハンドラーは次のようになります。

void MyViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    switch (e.PropertyName)
    {
        case "SomeProperty":
            // Do something
            break;
    }
}
57
Rachel

プロパティの変更をサブスクライブする直接的な方法は、INotifyPropertyChangedがそれを実装している場合は BaseViewModel を使用することです。

PropertyChanged += (obj, args) =>
   { System.Console.WriteLine("Property " + args.PropertyName + " changed"); }

そうでない場合は、DependencyObjectである必要があり、プロパティはDependencyPropertiesである必要があります(これはおそらくより複雑な方法です)。

この記事 は、DependencyPropertyの変更をサブスクライブする方法を説明しています。

2
Vlad