我在 Prism / WPF 项目中有一个这样的 ViewModel 类。
public class ContentViewModel : ViewModelBase, IContentViewModel
{
public ContentViewModel(IPersonService personService)
{
Person = personService.GetPerson();
SaveCommand = new DelegateCommand(Save, CanSave);
}
public Person Person { get; set; }
public DelegateCommand SaveCommand { get; set; }
private void Save()
{
// Save actions here...
}
private bool CanSave()
{
return Person.Error == null;
}
}
上述 ViewModel 中使用的 person 类型定义如下:
public class Person : INotifyPropertyChanged, IDataErrorInfo
{
private string _firstName;
public string FirstName
{
get { return _firstName; }
set
{
_firstName = value;
OnPropertyChanged("FirstName");
}
}
// other properties are implemented in the same way as above...
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
private string _error;
public string Error
{
get
{
return _error;
}
}
public string this[string columnName]
{
get
{
_error = null;
switch (columnName)
{
// logic here to validate columns...
}
return _error;
}
}
}
ContentViewModel 的一个实例被设置为 View 的 DataContext。在视图中,我使用绑定到 Person 如下:
<TextBox Text="{Binding Person.FirstName, ValidatesOnDataErrors=True}" />
<Button Content="Save" Command="{Binding SaveCommand}" />
当我对绑定到 FirstName 等 Person 属性的 TextBox 进行更改并单击 Save 时,我可以看到 ViewModel 命令处理程序中的更改。但是,如果这些属性中的任何一个在验证中失败,则永远不会执行 CanSave 并且永远不会禁用按钮。
如何在上述场景中禁用基于 DelegateCommand 的 CanExecute 操作处理程序的按钮?