私は単純なWPFアプリケーションを持っています。なぜNotifyOfPropertyChange()が予期したとおりに動作しないのかを知りたいと思います。私は2つのプロパティと1つのボタンを持つMainWindowViewModelを持っています。ボタンをクリックすると、NotifyOfPropertyChange()を呼び出してすべてのプロパティが変更されたことを通知します。また、私はViewModelにコンストラクタでコンパイルしたプロパティのリストを持っている:コンストラクタでNotifyOfPropertyChange()がviewmodelのプロパティを通知していない
properties = typeof(MainWindowViewModel).GetProperties()
.Where(p => p.DeclaringType == typeof(MainWindowViewModel));
を、私はのPropertyChangedに加入している:ここで
PropertyChanged += (sender, args) =>
{
if (properties.Any(p => p.Name == args.PropertyName))
IsDirty = true;
};
は私の全体のMainViewModelです:
public class MainWindowViewModel : Screen
{
private string name;
private IEnumerable<PropertyInfo> properties;
public string Name
{
get { return name; }
set
{
name = value;
NotifyOfPropertyChange(() => Name);
}
}
private int age;
public int Age
{
get { return age; }
set
{
age = value;
NotifyOfPropertyChange(() => Age);
}
}
private bool isDirty;
public bool IsDirty
{
get { return isDirty; }
set
{
isDirty = value;
NotifyOfPropertyChange(() => IsDirty);
}
}
public MainWindowViewModel()
{
// get list of class properties
properties = typeof(MainWindowViewModel).GetProperties()
.Where(p => p.DeclaringType == typeof(MainWindowViewModel));
// if any property has been updated, set isDirty to true
PropertyChanged += (sender, args) =>
{
if (properties.Any(p => p.Name == args.PropertyName))
IsDirty = true;
};
}
public void Save()
{
NotifyOfPropertyChange();
}
}
アプリケーションが実行されると、コンストラクターは名前、年齢、およびIsDirtyのプロパティーのリストを正しく生成します。ただし、Saveボタンをクリックすると、ViewModelに関連付けられていない他のプロパティのPropertyChangedEventが生成されます。IsInitializedおよびIsActiveはスクリーンのプロパティであり、リストのプロパティに対しては生成されません。誰かがここで何が起こっているのか教えてくれますか?私は、私が何をしようとしているのかがはっきりしていると思います。これは検証シナリオです。プロパティボタンをクリックしてすべてのプロパティを検証できるように、PropertyChangedを呼び出してフラグを設定する必要があります。
にブレークポイントを設定します。セッターは実際に呼び出されていますか? (もしそうなら、setter *のコードを* NotifyOfPropertyChangeに進めて、そのメソッドが実際に何をしているかを確認してください...) – elgonzo
いいえNotifyOfPropertyChange()は実際のセッターを呼び出しているとは思いません。 – Will
もちろん、NotifyOfPropertyChangeはセッターを呼び出していません。メソッドが "RequestPropertyChange"または "ChangeProperty"ではなく "NotifyOfPropertyChange"と呼ばれていないことに注意してください...それを得ましたか?:-)だから、あなたのコードのどこにあなたのプロパティの1つのセッターですか? – elgonzo