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;
}
}