Проверка WPF и шаблоны данных - PullRequest
1 голос
/ 16 августа 2010

Я ищу способ проверки всех данных в форме, в которой есть вкладки, а вкладки содержат шаблоны данных. Я просмотрел весь вопрос и нашел здесь похожий вопрос: http://www.netframeworkdev.com/windows-presentation-foundation-wpf/wpf-validation-data-templates-74176.shtml,, но он не дал хорошего ответа.

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

Есть ли простое, чистое решение для этого?

Любая помощь будет высоко ценится.

Ответы [ 2 ]

1 голос
/ 16 августа 2010

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

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

Свойства модели представления содержат значения, отображаемые в представлении, независимо от того, являются ли эти значения действительными. Единственное время, когда должно быть несоответствие между значением в представлении и значением в модели представления, - это когда фокус редактируемого элемента управления имеет значение, пользователь изменяет его значение, а привязка не возвращает новое значение обратно в представление. модели пока нет.

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

В моих классах модели представления я реализую свойство Dictionary<string, string> с именем Errors. Проверка в установщиках свойств заполняет Errors ошибкой проверки каждого свойства или равна нулю, если свойство допустимо. Это делает реализацию IDataErrorInfo.Item простой:

public string this[string propertyName]
{
   get
   {
      return Errors.ContainsKey(propertyName) ? Errors[propertyName] : null;
   }
}

Я также могу реализовать это свойство:

public bool IsValid { get { return !(Errors.Values(x => x != null).Any()); } }

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

0 голосов
/ 16 августа 2010

Рассматривали ли вы использование IDataErrorInfo и использование соответствующих привязок для принудительной проверки (см. здесь , здесь , здесь )?

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