В настоящее время я использую интерфейс IDataErrorInfo
для реализации проверки в приложении WPF. Индексатор, который является частью этого интерфейса позволяет проверить одно свойство, например, так:Проверка перекрестных свойств в WPF
public string this[string columnName]
{
get
{
switch (columnName)
{
case "LastName":
if (string.IsNullOrEmpty(this.LastName))
return "LastName must not be empty.";
break;
// case, case, case, etc., etc.
}
return null;
}
}
Если ошибка проверки происходит отобразить звездочку с подсказкой рядом с TextBox.
Что делать, если у меня есть правила проверки, которые не имеют строгого отношения к одному свойству? Например, если объект домена, представляющий заказ, имеет дату отправки и дату счета, и я хочу проверить правильность того, что дата счета должна быть позже или равна дате отправки?
Конечно, я мог бы принудительно ввести это правило в индекс, проверив соотношение дважды, один раз для columnName «ShippingDate» и один раз для columnName «InvoiceDate», а затем пометить ошибку звездочкой на обоих полях ввода в пользовательском интерфейсе , например, так:
public string this[string columnName]
{
get
{
switch (columnName)
{
case "ShippingDate":
case "InvoiceDate":
if (this.ShippingDate > this.InvoiceDate)
return "Invoice date must not be before shipping date.";
break;
}
return null;
}
}
Но я предпочел бы иметь «уровень объекта» или «крест свойство» проверку независимо от индексатора (индексатор должен сообщать только недопустимое «одно свойства состояния») и отображать эти объекты уровня или взаимосвязи в отдельном интерфейсе.
Я надеялся, что свойство Error
интерфейса IDataErrorInfo
может иметь эту цель проверки уровня объекта. WPF вызывает индексатор для проверки свойств, когда я указываю ValidatesOnDataErrors=True
в выражении Binding TextBox, например. Но я не мог найти способ сказать WPF вызвать свойство Error
всякий раз, когда я изменяю некоторые данные в своих полях ввода. Может быть, мое предположение о цели этого свойства неверно?
Как я могу реализовать проверку перекрестных свойств в WPF?
Благодарим вас за предложения!
не могли бы вы предоставить некоторый исходный код для этого? У меня такая же проблема ... – Rob
@Rob: Я добавил краткий очерк о том, как выглядит материал, см. Мой вариант Edit 2 выше. – Slauma