У меня есть простой диалог WPF, позволяющий пользователю вводить имя.Мы используем подход Mvvm без каких-либо файлов с выделенным кодом.Мне нужно подтвердить ввод и включить кнопку ОК только тогда, когда ввод действителен.В настоящее время я выполняю проверку с использованием настраиваемого шаблона ошибок в моем представлении и пользовательской реализации класса ValidationRule.
Текстовое поле в диалоге определяется как:
<TextBox Width="250" Height="25" Margin="5"
Validation.ErrorTemplate="{StaticResource customErrorTemplate}">
<TextBox.Text>
<Binding Path="WitnessName" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<ValidationRules:NameRule />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
NameRuleопределяется как:
public class NameRule : ValidationRule
{
public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
{
var isValid = (value as string == null) || Regex.IsMatch(value.ToString(), @"^[\p{L} \.'\-]+$");
return new ValidationResult(isValid, "Name can contain only letters, apostrophes and hyphens.");
}
}
Свойство IsEnabled кнопки OK привязано к свойству IsOkEnabled в модели представления, которое имеет значение true, только если вход является действительным.
<Button Name="OnOkClick" Margin="5" IsEnabled="{Binding IsOkEnabled}">OK</Button>
IsOkEnabledсвойство обновляется в ответ на изменение в тексте WitnessName путем мониторинга события PropertyChanged WitnessName.
public string WitnessName
{
get
{
return this.witnessName;
}
set
{
this.witnessName = value;
this.NotifyOfPropertyChange(() => this.IsOkEnabled);
}
}
Проблема заключается в том, что при проверке, работающей в представлении, событие PropertyChanged не запускается в vewмодели при вводе недопустимого ввода, поэтому свойство IsOkEnabled не обновляется и кнопка «ОК» остается включенной.
Существует ли способ принудительного обновления свойства IsOkEnabled в ответ на даже недопустимый ввод на моемтекущая реализация?
Я смотрел на оба Карла Шифлета и Джоша Смита , но ни один из них не использует (насколько я могу судить) шаблон ошибки просмотра, и я хотел бы использовать его для визуальной обратной связи.
Обновление: пробуя это со связанной ICommand, как предложено Danny
Я попробовал это, создав виртуальную машину, специфичную для кнопки OK, которая реализует ICommand.OkButtonViewModel имеет свойство для хранения виртуальной машины диалога (устанавливается IoC и unity), а реализации CanExecute и Execute ссылаются на соответствующие свойства / методы на этой виртуальной машине.
В OkButtonViewModel:
public bool CanExecute(object parameter)
{
return this.witnessDialogue.IsValid;
}
public void Execute(object parameter)
{
this.witnessDialogue.OnOkClick();
}
Как мне привязать мою кнопку к этой виртуальной машине, а не к диалогу виртуальной машины?Я могу сделать это, если OkButtonViewModel является свойством виртуальной машины диалога, но не тогда, когда зависимость является другой, как это должно быть, чтобы кнопка могла использовать реализации виртуальной машины диалога.