2013-10-08 5 views
0

Я изучаю MVVM «на лету», но у меня возникают проблемы с поиском правильного расположения класса валидатора.Где я могу поставить валидацию

У меня есть проект с моей бизнес-логикой и WPF-проектом. Последний создается после MVVM-шаблона.

Целью приложения является считывание данных с внешнего устройства и подтверждение этих данных. Методы проверки (1 для каждого свойства устройства) хранятся в BL.

В GUI мне нужно показать свойства устройства и не являются ли они действительными.

Что я сейчас:

  • 1 вид (MainWindowView)
  • 1 ViewModel (MainWindowViewModel)
  • 1 модель (DeviceModel)

MainWindowViewModel имеет свойство типа DeviceModel , Это свойство используется для отображения данных устройства в представлении. В настоящее время у меня есть несколько HasValidPropXxxx свойства типа bool, которые связаны с Background -свойством соответствующего текстового поля (с использованием IValueConverter от bool к Color). Поскольку это было всего 5 объектов, я думал, что они были в хорошем месте.

Теперь требования изменились (очевидно), и я должен показать и проверить гораздо больше свойств устройства. Я думал создать класс DeviceValidator, в котором хранятся все свойства HasValidPropXxxx и выполняет ли проверки валидации BL.

То, что я хотел бы знать:

  1. Это хороший способ мышления (особенно в отношении MVVM)
  2. В каком месте я должен поставить этот валидатор: Модели? ViewModels? Другая папка?

ответ

1

Для проверки я всегда применяю либо интерфейсы IDataErrorInfo, либо INotifyDataErrorInfo, причем второй является более новым и (на мой взгляд) лучше. При реализации этих интерфейсов в классах классов данных или типов вы предоставляете право проверки, где определяются свойства. Это имеет для меня полный смысл, так как позволяет также выполнить комплексную проверку с использованием нескольких значений свойств.

Вот краткий пример IDataErrorInfo ...первый реализовать метод Item индексатора:

public override string this[string propertyName] 
{ 
    get 
    { 
     string error = string.Empty; 
     if (propertyName == "Name" && Name == string.Empty) error = "Enter Name"; 
     else if (propertyName == "Age" && Age < 18) error = "You're too young"; 
     return error; 
    } 
} 

Интерфейс IDataErrorInfo выставляет свойство с именем Error который этот индексатор устанавливает, когда любое соответствующее свойство класса модели изменяется. Мы можем Bind этому свойству в пользовательском интерфейсе, чтобы показать сообщения об ошибках, но только один, в то время с этим интерфейсом без настройки:

<TextBlock Text="{Binding Error}" /> 
<TextBlock Text="{Binding Name}" /> 
<TextBlock Text="{Binding Age}" /> 

UPDATE >>>

Когда я хочу, чтобы изменить что-то на основе есть ли сообщение об ошибке в Error собственности, добавить bool свойства в модели базового класса:

public bool HasError 
{ 
    return Error != null && Error != string.Empty; 
} 

Тогда я просто использовать эту bool свойства с BoolToWhateverConverter ... в вашем случае вам нужно создать BooleanToBrushConverter. Если вам нужна помощь, задайте другой вопрос, и я буду следить за ним.

UPDATE 2 >>>

@Koen, вы правы, что HasError свойство отражает, есть ли какие-либо ошибки проверки в модели объекта. Однако, нет ничего, чтобы остановить вас от добавления другого свойства в конкретный класс типа данных:

string nameError = "Enter Name"; 
... 
public override string this[string propertyName] 
{ 
    get 
    { 
     string error = string.Empty; 
     if (propertyName == "Name" && Name == string.Empty) error = nameError; 
     else if (propertyName == "Age" && Age < 18) error = "You're too young"; 
     return error; 
    } 
} 

public bool HasNameError 
{ 
    return Error == nameError; 
} 

Это, конечно, желательно иметь эти свойства в классе модели, так что вам не придется копировать код в каждом представлении модель, в которой появляется класс модели.

+0

Мне нужно изменить фон соответствующего текстового поля/метки, когда свойство устройства недействительно. Возможно ли использование этих интерфейсов? На первый взгляд я не понимаю, как это сделать. – Koen

+0

У меня уже работает BoolToBrushConverter, но мне было интересно, могу ли я - используя IDataErrorInfo - изменить цвет 1 текстового поля, вне зависимости от других свойств ошибки. В этот момент у меня есть свойство IsValidPropXxxx для каждого свойства. Глядя на ваше обновление, это проверка для всего объекта. Я кооректируюсь? – Koen

+0

@Koen: см. Ссылку, в которой будет описана ошибка ErrorTemplate http://msdn.microsoft.com/en-us/library/system.windows.controls.validation.errortemplate.aspx – Ravuthasamy

0

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

+0

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

Смежные вопросы