WPF: MVVM - Отключить вложенную кнопку команды в исключении преобразования ivalueconverter - PullRequest
0 голосов
/ 07 марта 2011

У меня есть простой сценарий и проблема с ним, которую я просто не могу решить за последние несколько дней.

ОК, в первую очередь я использую MVVM для привязки своего View к ViewModel. На мой взгляд, у меня есть несколько текстовых полей, которые привязываются к нескольким свойствам (большинство строк) в ViewModel (фактически привязывает к пользовательскому объекту (тип Person, имя SelectedPerson) со свойствами строк, объект, который является свойством модели представления). Этот объект реализует INotifyPropertyChanged и IDataErrorInfo. Он также имеет свойство int с именем Age. На мой взгляд, у меня также есть кнопка, связанная с командой в моей viewmodel, команда, которая внутри CanExecute проверяет свойства SelectedPerson и возвращает true, если все они верны.

Теперь моя проблема: если я добавлю в текстовое поле Age из моего View что-то, не являющееся int, появится красный tectagle (это нормально, потому что есть исключение для преобразования), но в этот конкретный момент, к объект позади (SelectedPerson, тип Person) не отправляется newValue (установщик для этого свойства Age, или члены IDataErrorInfo не перехватывают значение .... Я думаю, это нормально, потому что нет "нового" "значение, потому что я поставил неправильный формат в текстовом поле в первую очередь).

Итак, возможно, повторюсь, проблема в том, что если новый возраст (новый неверный возраст) не установлен, то объект позади все еще содержит последнее значение, которое, если оно было правильным, то и сама команда является правильной ( может выполнить вернет истину) и кнопка включена

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

PS: я использовал класс IValueConverter, и в этом текстовом поле, привязанном к Age, я использовал мой класс StringToIntConverter .... но в методе Convert я не знаю, как передать объект SelectedPerson, привязанный (я просто передать текстовое значение и вернуть значение типа int)

Полагаю, одним из способов сделать это может быть использование сценария MultiBinding, но я не уверен.

Если бы я мог передать SelectedPerson внутри метода Convert из этого конвертера, я мог бы аннулировать эту команду из самого конвертера.

Извините за мой английский, я знаю, что он далек от совершенства :) и заранее спасибо за ваше время.

1 Ответ

1 голос
/ 07 марта 2011

Я думаю, что самым чистым решением было бы вместо этого связать текстовое поле со строковым свойством и обновить вашу модель представления, чтобы ваша реализация IDataErrorInfo для этого имени свойства пыталась преобразовать строку в int и вернуть результат этого. Ваш тест CanExecute также будет включать это преобразование как часть проверочного теста.

...