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