Неверные данные в TextBox - Как отключить мои кнопки управления?
В основном у меня следующая ситуация:
<TextBox Text="{Binding MyIntValue}" />
<Button prism:Click.Command={Binding MyCommand}" />
public Boolean CanDoCommand()
{
return (MyIntValue < 100);
}
public void DoCommand() { ... }
Так вот в чем проблема, если я введу значение 25, MyCommand станет активным. Впоследствии, если я изменю его на 25A, кнопка все еще будет включена, потому что привязка не была обновлена, чтобы отразить ошибку в моей модели представления. Вместо этого у меня только ошибка привязки в моем представлении. Это оставляет кнопку MyCommand включенной, а значение MyIntValue по-прежнему равно 25.
Как я могу отключить кнопку, если возникнут какие-либо проблемы с привязкой, даже если мой ViewModel правильный?
Изменить (что действительно просит плакат):
Как я могу отключить кнопку независимо от того, что метод CanExecute возвращает из ViewModel на основе View, имеющего BindingError?
3 ответа
<Button prism:Click.Command={Binding MyCommand,
UpdateSourceTrigger=PropertyChanged}" />
Вы должны поднять команду может выполнить измененное событие при изменении MyIntValue.
Если ваше свойство MyIntValue имеет тип int, то ваша привязка никогда не будет обновляться при вводе 25A.
Единственный способ решить эту проблему - использовать тип строки и IDataErrorInfo на стороне виртуальной машины.
Другой способ - использовать typeof Nullable int и конвертер и установить значение в null, если оно не соответствует ожидаемому.
РЕДАКТИРОВАТЬ:
Как я могу отключить кнопку, если возникнут какие-либо проблемы с привязкой, даже если мой ViewModel правильный?
Ваша проблема в том, что ваша виртуальная машина и ваш пользовательский интерфейс не синхронизированы. если вы наберете 25A, ваш Vm кажется правильным, потому что он все еще имеет 25, но ваш View имеет BindingError. поэтому ваш вопрос должен быть, как я могу синхронизировать мой вид и модель представления. (см. мои два предложения)
РЕДАКТИРОВАТЬ: другое решение будет предотвращать неправильный ввод. поэтому поведение Masked или RegexTextbox также должно работать.