3

誰かが使用されているPropertyChangedMessageの実用的な例を投稿できますか?GalaSoftサイトの説明には次のように記載されています。

PropertyChangedMessage:プロパティが送信者で変更されたことをブロードキャストするために使用されます。PropertyChangedイベントと同じ目的を果たしますが、より厳密ではありません。

ただし、これは機能していないようです。

private bool m_value = false;
public bool Value
{
    get { return m_value ; }
    set 
    { 
        m_value = value;
        Messenger.Default.Send(new PropertyChangedMessage<bool>(m_value, true, "Value"));
    }
4

2 に答える 2

7

これは、MVVMライトメッセンジャーに関連しています。

プロパティ定義では、次のように使用します。

public string Name {
    get
    {
        return _name;
    }
     set
    {
        if (_name == value)
        {
            return;
        }
         var oldValue = _name;
        _name = value;
         // Update bindings and broadcast change using GalaSoft.MvvmLight.Messenging
        RaisePropertyChanged(Name, oldValue, value, true);
    }
}

次に、次のようなものを使用して、プロパティの変更をサブスクライブできます。

Messenger.Default.Register<PropertyChangedMessage<string>>(
    this, (e) => this.Name = e.NewValue
);

この投稿を見て、 MVVMライトメッセンジャーについて読んでください

放送へ:

Messenger.Default.Send<PropertyChangedMessage<string>>(oldValue, newValue, "PropertyName");
于 2012-11-19T20:14:55.227 に答える
4

Daniel Castroは、私の質問に次の質問でコメントしました。「コードに何を期待しますか?」

この質問への答えは、私自身の質問にこの答えを書くように促しました。

私の期待は、MVVM-LightドキュメントのPropertyChangedMessageクラスの不適切な記述に基づいて、PropertyChangedMessageを送信すると、ViewModelBaseクラスのRaisePropertyChangedメソッドが自動的に呼び出されることでした。

どうやら、しかし、それは逆です。RaisePropertyChangedを呼び出すと、そのメソッドにはオーバーロードがあり、PropertyChangedMessageを送信するかどうかを決定するフラグを設定できます。

ただし、当初期待していた機能が欲しい。RaisePropertyChangedが自動的に呼び出されるようにする新しいPropertyChangedMessageを送信したいと思います。その方法は次のとおりです。

保護されたRaisePropertyChangedメソッドを呼び出すだけの次のパブリックNotifyPropertyChangedメソッドを使用して、ViewModelBaseから新しいクラスを派生させます。

public abstract class MyViewModelBase : GalaSoft.MvvmLight.ViewModelBase
{
    public void NotifyPropertyChanged(string propertyName)
    {
        RaisePropertyChanged(propertyName);
    }
}

次に、新しいNotifyPropertyChangedメソッドを呼び出すPropertyChangedMessageから新しいクラスを派生させます。

public class MyPropertyChangedMessage<T> : PropertyChangedMessage<T>
{
    public MyPropertyChangedMessage(object sender, T oldValue, T newValue, string propertyName)
        : base(sender, oldValue, newValue, propertyName)
    {
        var viewModel = sender as MyViewModelBase;

        if (viewModel != null)
        {
            viewModel.NotifyPropertyChanged(propertyName);
        }
    }

    public MyPropertyChangedMessage(object sender, object target, T oldValue, T newValue, string propertyName)
        : base(sender, target, oldValue, newValue, propertyName)
    {
        var viewModel = sender as MyViewModelBase;

        if (viewModel != null)
        {
            viewModel.NotifyPropertyChanged(propertyName);
        }
    }
}

私はこのアプローチをテストし、UIを適切に更新する次のようなコードを実際に記述できることを確認しました。

private bool m_value = false;
public bool Value
{
    get { return m_value; }
    set
    {
        Messenger.Default.Send(new MyPropertyChangedMessage<bool>(this, m_value, value, "Value"));
        m_value = value;
    }
}
于 2012-11-19T21:06:25.907 に答える