Почему ViewModel не обновляется, когда WPF TextBox признан недействительным? - PullRequest
5 голосов
/ 12 июля 2011

Сегодня я рассмотрел пример MSDN для проверки входных данных WPF TextBox (см. Также: http://msdn.microsoft.com/en-us/library/ms753962.aspx).

. В моем собственном приложении я связываю DataContext представления с ViewModel, используя шаблон MVVM.. Некоторые текстовые поля привязываются к свойствам в ViewModel и имеют определенные ValidationRules.

Я обнаружил, что когда значение становится недействительным, после того, как оно было успешно проверено ранее, старое значение останется в ViewModel.На мой взгляд, очень бесполезно, потому что значения используются, например, для выполнения команд.

Эта моя точная проблема также применима к данному примеру MSDN. Значение TextBox отправляется обратно его источнику только после его успешного завершения.Я хотел бы сохранить логику проверки, но она всегда должна обновлять источник. Это возможно?

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 12 июля 2011

Как указали Рэйчел и Хенк, именно так строятся правила валидации WPF. Если проверка не пройдена, значение не будет записано в свойство.

Что касается того, почему они решили построить его таким образом, то, вероятно, потому, что они хотят последовательного поведения в случае неудачной проверки. Иногда значение в представлении недопустимо (например, отрицательный возраст), но оно может быть записано в свойство. В других случаях он недопустим таким способом, который невозможно было бы записать в свойство (например, возраст «foo» не может быть преобразован в int). Это может сбить с толку, если поведение «записать значение в свойство, если это возможно».

Как и вы, я бы предпочел, чтобы мой ViewModel обновлялся по мере возможности, независимо от ошибок валидации. Бизнес-объекты - это другое дело , но "Fort Knox ViewModels" мне кажется странным, потому что неверный ввод не просто в порядке, он ожидается . Обычно в моей ViewModel я хочу знать «текущее значение», а не «последнее действительное значение». Это одна из причин, по которой мне не нравятся ValidationRules.

2 голосов
/ 12 июля 2011

Проверка правильности введенных данных для указанного свойства.Если данные недействительны, они не должны храниться в свойстве.

Например, если кто-то печатает букву в TextBox, привязанном к полю Integer, приложение не должно пытаться поместить символ в int, потому чтобудет выдано исключение.

Альтернативой является использование отдельного метода IsValid(), который выполняет ручную проверку ваших данных и возвращает истину / ложь, если данные действительны или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...