恐怕我只能想到你提到的解决方案。每次更改属性时添加一个事件。您可以将其集中用于整个班级,以避免向每个属性添加样板代码。
如果您正在使用 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 自动启用/禁用按钮