IDataErrorInfo со сложными типами
-
10-07-2019 - |
Вопрос
У меня есть объект Address, который определяется следующим образом:
public class Address
{
public string StreetNumber { get; set; }
public string StreetAddress { get; set; }
public string City { get; set; }
public string PostalCode { get; set; }
}
Довольно просто. На совете ответ на другой вопрос я спросил, я имею в виду это сообщение в блоге при привязке моего пользовательского интерфейса к объекту типа Person (который содержит поле Address MailingAddress).
Проблема в том, что метод интерфейса IDataError не проверяет ни одно из свойств типа Address.
public string this[string columnName]
{
get
{
string result = null;
// the following works fine
if(columnName == "FirstName")
{
if (string.IsNullOrEmpty(this.FirstName))
result = "First name cannot be blank.";
}
// the following does not run
// mostly because I don't know what the columnName should be
else if (columnName == "NotSureWhatToPutHere")
{
if (!Util.IsValidPostalCode(this.MailingAddress.PostalCode))
result = "Postal code is not in a know format.";
}
return result;
}
}
Итак, очевидно, я не знаю, каким будет columnName ... Я прошел через это, и это никогда не было чем-то иным, кроме открытых свойств (внутренних типов). Я даже пытался разобраться с таким утверждением, как:
if (columnName.Contains("Mailing") || columnName.Contains("Postal"))
System.Windows.Forms.MessageBox.Show(columnName);
Все безрезультатно.
Я что-то упускаю?
Решение
Вам нужно определить IErrorInfo для всех классов, для которых вы хотите предоставлять сообщения об ошибках.
Другие советы
Посмотрите мой ответ здесь . р>
Здесь объясняется, как использовать связыватель моделей для добавления проверки на уровне класса вашей модели без использования IDataError
- что, как вы видели здесь, может быть довольно неуклюжим. Он по-прежнему позволяет использовать атрибуты [Обязательные] или любые другие пользовательские атрибуты проверки, но позволяет добавлять или удалять отдельные ошибки модели. Для получения дополнительной информации о том, как использовать аннотации данных, я настоятельно рекомендую это сообщение от Скотта Гу .