У меня есть ItemType, который реализует все, что нужно для проверки с помощью интерфейса IDataErrorInfo:
#region IDataErrorInfo implementation
//WPF doesn't need this one
public string Error
{ get { return null; } }
public string this[string propertyName]
{
get { return GetValidationError(propertyName); }
}
#endregion
#region Validation
public bool IsValid
{
get
{
foreach (string property in ValidatedProperties)
{
if (GetValidationError(property) != null)
{
return false;
}
}
return true;
}
}
static readonly string[] ValidatedProperties =
{
"Name"
};
private string GetValidationError(string propertyName)
{
if (Array.IndexOf(ValidatedProperties, propertyName) < 0)
return null;
string error = null;
switch (propertyName)
{
case "Name":
error = ValidateName();
break;
default:
Debug.Fail("Unexpected property being validated on Customer: " + propertyName);
break;
}
return error;
}
string ValidateName()
{
if (!IsStringMissing(Name))
{
return "Name can not be empty!";
}
return null;
}
static bool IsStringMissing(string value)
{
return string.IsNullOrEmpty(value) ||
value.Trim() == String.Empty;
}
#endregion
ItemType оборачивается ItemViewModel. На ItemViewModel у меня есть команда, когда пользователь нажимает кнопку Сохранить:
public ICommand SaveItemType
{
get
{
if (saveItemType == null)
{
saveItemType = new RelayCommand(() => Save());
}
return saveItemType;
}
}
Затем в DetailsView у меня есть следующий код xaml:
<TextBlock Text="Name:" />
<TextBox Grid.Column="1" Name="NameTextBox" Text="{Binding Name, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}"
Validation.ErrorTemplate="{x:Null}" />
<ContentPresenter Grid.Row="13" Grid.Column="2"
Content="{Binding ElementName=NameTextBox, Path=(Validation.Errors).CurrentItem}" />
происходит следующая архитектура (неясно, но форма на самом деле представляет собой независимый файл xaml (пользовательский элемент управления), где тексту данных сетки в форме задано значение ObservableCollection):
<Grid DataContext="{Binding Items}">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
![enter image description here](https://i.stack.imgur.com/jdKnI.png)
У меня проблема в том, что сообщения об ошибках не отображаются. Когда я ставлю точку останова и проверяю, правильно ли она проверяется и есть ли у меня какие-либо сообщения об ошибках, они у меня появляются. Но почему-то сообщение об ошибке не приходит в xaml.
Что такое недостающий кусочек головоломки?
РЕДАКТИРОВАТЬ - ОТСУТСТВУЮЩАЯ ЧАСТЬ
Правильно, вот что было следующим:
Я реализовал IDataErrorInfo на моей модели, но не на ViewModel, который оборачивает модель. Что мне нужно было сделать, так это реализовать интерфейс IDataErrorInfo в ViewModel и получить его из модели.
ViewModel Реализация IDataErrorInfo:
{ get { return (ItemType as IDataErrorInfo).Error; } }
public string this[string propertyName]
{
get
{
return (ItemType as IDataErrorInfo)[propertyName];
}
}