У меня есть такой класс ViewModel в проекте Prism / WPF.
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;
}
}
Тип персоны, используемый в представленной выше модели представления, определяется следующим образом:
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 устанавливается как DataContext для View. Внутри представления я использовал привязку к Person следующим образом:
<TextBox Text="{Binding Person.FirstName, ValidatesOnDataErrors=True}" />
<Button Content="Save" Command="{Binding SaveCommand}" />
Когда я делаю изменения в TextBox, который связан со свойствами Person, такими как FirstName, и нажимаю Save, я мог видеть изменения в обработчике команд ViewModel. Но если какое-либо из этих свойств не проходит проверку, CanSave никогда не выполняется и кнопка никогда не отключается.
Как отключить кнопку на основе обработчика действия DelegateCommand CanExecute в приведенном выше сценарии?