2009-10-14 22 views
6

Ну, я думаю, что у меня довольно хорошее понимание MVVM. Но мне нужны некоторые разъяснения.MVVM, WPF и валидация

Является ли ViewModel ответственным за вызов соответствующей службы для сохранения информации о модели?

Если это так, то ViewModel должен иметь чистый способ определения, являются ли данные, которые он имеет, действительными. Если данные действительны, он соответствующим образом обновит модель. Наконец, служба для сохранения модели вызывается с учетом новой обновленной модели. Тогда возникает вопрос: как мы проверяем информацию ViewModel и легко отображаем ее в представлении?

Я видел несколько разных подходов к проверке. Один из них предлагает использовать IDataErrorInfo, который я считаю абсолютно отвратительным.

Другое добавление ValidationRule в Binding.ValidationRules. Однако, используя этот подход, нельзя работать в контексте модели в целом. Объект ValidationRule может выполнять проверку только по одному значению. Примером может быть обеспечение того, что значение является целым числом или в определенном диапазоне.

Другая идея, которую я только начал изучать, - это использование BindingGroup's. Но я не знаю много об этом в этот момент, потому что я все еще читаю об этом.

Я хотел бы иметь возможность выполнять логику проверки в одном месте, которое будет использоваться View и ViewModel. В дополнение к этому требованию я хотел бы иметь возможность выполнять проверки в отношении любого другого значения в ViewModel. Кроме того, можно предотвратить отображение ViewModel из сохраняющихся данных, если это недопустимое состояние. Это необходимо будет легко отразить в представлении.

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

+1

Из интереса, почему, по вашему мнению, IDataErrorInfo является отвратительным? –

+2

Я думаю, что это неправильное использование индексатора для начала. ViewModel ["Name"] должен возвращать имя ... не null/"error!". Вы также ограничены свойствами, которые вы привязали в представлении. Он не подходит для валидаторов, таких как ValidateNameInformation, где он может проверять все поля. Если меня не поняли в этих заявлениях, пожалуйста, исправьте меня. – Joe

+2

Один из способов, которым я получаю arround злоупотребление индексатором, - использовать явную реализацию интерфейса. Таким образом, у меня нет странного «индексатора», засоряющего мой общий интерфейс ViewModel. Я все еще работаю над тем, как проверять несколько полей с помощью MVVM. –

ответ

2

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

Мы делаем isdirty и isValid практически для каждого поля бизнес-уровня, мы пишем наш собственный пользовательский объект поля и настраиваемый внешний ссылочный объект, который реализует это. то мы можем привязать staraight к этим свойствам, чтобы визуально видеть, действительно ли мы действительны/грязны и т. д. Затем мы протазываем эти свойства через модель представления.

+2

У вас есть несколько библиотек, которые помогут вам, например. Блок приложения проверки (http://msdn.microsoft.com/en-us/library/cc309509.aspx) и CSLA (http://www.lhotka.net/cslanet/) – armannvg