2014-01-10 3 views
0

У меня есть следующие настройки WPF-MVVM:данных в C# WPF MVVM проверки

  • Вид с 2 TextFields связанными с свойствами ViewModel с UpdateSourceTrigger = PropertyChanged и кнопки с командой связывания с командой реле (CanExecute, Execute methods)
  • ViewModel, который реализует INotifyDataErrorInfo с 2 свойствами, аннотированными с помощью [System.ComponentModel.DataAnnotations.Required]. Свойство setter вызывает частный метод ViladateProperty, который сохраняет результаты проверки в словаре ошибок. Свойство HasErrors getter проверяет словарь ошибок, чтобы вернуть соответствующее значение.

Цель состоит в том, чтобы включить кнопку, как только вся форма проверяется правильно. Мои два вопроса по этому поводу являются:

  • Как реализовать метод CanExecute команды реле кнопки без вызова проверки на всей модели для каждого изменения свойств?
  • Каков наилучший способ «задержать» UpdateSourceTrigger для установки соответствующего свойства не на каждое нажатие клавиши, но, например, через одну секунду «без ввода»?

ответ

1

Ваш CanExecute обработчик должен просто обратитесь к HasErrors собственности:

... (canExecute) => !HasErrors; ... 

• Как реализовать метод CanExecute команды кнопки реле без вызова проверки на всей модели для каждого изменения свойств ?

Может ли вы сказать мне, как система собственности может знать, есть ли какая-либо ошибка проверки, если она не проверки после каждого нажатия кнопок? Подумайте об этом ... любой ключевой штрих может сделать модель недействительной. В любом случае, вы не заметите каких-либо задержек, поскольку он переоценивает модель.

• Каков наилучший способ «задержать» UpdateSourceTrigger для установки соответствующего свойства не на каждое нажатие клавиши, но, например, через одну секунду «без ввода»?

Если вы используете .NET 4.5, вы в удаче ... Microsoft просто добавила Delay свойство к Binding класса. Это позволяет вам установить количество времени в миллисекундах, чтобы дождаться обновления источника привязки после изменения значения целевого значения. Для получения полной информации см. Страницу BindingBase.Delay Property на MSDN.

+0

Благодарим вас за ответ на второй вопрос! О первом вопросе - мой обработчик CanExecute ссылается только на HasErrors, как вы описали. Точка является стратегией проверки: Если вы проверяете все свойства при каждом изменении свойств, второй текстовый файл (без ввода) становится недействительным, как только первый становится пустым и наоборот. Если вы проверяете только измененное свойство, вы можете получить недопустимую форму, поскольку другое текстовое поле не было проверено. Вопрос заключается в том, как проверить все свойства, не проверяя их при каждом изменении свойств. – toppless

+0

Я не уверен, как вы проверили свою проверку, даже если вы говорите о проверке бизнес-правил или просто проверке типа данных, но я вообще не манипулирую элементами управления пользовательским интерфейсом, когда данные становятся недействительными. Я просто заставляю всю форму светиться красным цветом и отображать точные сообщения об ошибках в коллекции в пользовательском интерфейсе, которые пользователь может исправить. – Sheridan

+0

Это более общий вопрос: когда вызывать проверку всей формы (чтение: проверка на каждое свойство), если вы проверяете одно свойство при изменении события этого свойства? – toppless