残念ながら、あなたが言及した解決策についてしか考えることができません。プロパティが変更されるたびにイベントを追加します。ただし、定型コードをすべてのプロパティに追加することを避けるために、クラス全体で集中化することができます。
MVVM を使用して実装している場合は、プロパティのセッターで起動するメソッドをINotifyPropertyChanged
クエリできます。HasChanges
OnPropertyChanged
OnPropertyChange("xyz")
class ClassA : INotifyPropertyChanged
{
private bool _name;
public bool Name
{
get { return _name; }
set
{
if (value != _name)
{
_name = value;
OnPropertyChanged("Name");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
IsSaveEnable = HasChanges();
}
}
別の可能な解決策は、IDataErrorInfo
実装で共通の検証領域を使用することです。しかし、おそらくこのロジックを配置する適切な場所ではありません
http://codeblitz.wordpress.com/2009/05/08/wpf-validation-made-easy-with-idataerrorinfo/
最後に、この動作を持つ特定の添付プロパティを作成できます。つまり、EventToCommand パターンの機能を手動で実装し、そこにカスタム ロジックを追加するという考え方です。
DelegateCommand または RelayCommand を使用している場合のコマンドの有効化/無効化については、コマンド RaisePropertyChanged を呼び出して、ボタンを自動的に有効化/無効化できます。