Базовый класс моей модели представления изначально реализовывал INotifyDataErrorInfo, и все работало безупречно, но сейчас я изучаю, как я могу выполнять проверку, используя композицию, а не наследование, чтобы мой базовый класс модели представления не должен был делать ничего, кроме INotifyPropertyChanged. Я также ищу многоразовое решение, поэтому мне не нужно реализовывать INotifyDataErrorInfo во всех моих моделях представлений.
Я создал конкретную реализацию INotifyDataErrorInfo, которую я могу включить в свои модели представлений, требующие проверки (включен только соответствующий код):
public class NotifyDataErrorInfo : INotifyDataErrorInfo
{
public readonly Dictionary<string, string> ValidationErrorsByPropertyName = new Dictionary<string, string>();
public IEnumerable GetErrors(string propertyName)
{
...
}
public bool HasErrors { get; }
public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;
}
Когда MyViewModel имеет ошибки проверки, он получает/устанавливает их через экземпляр объекта NotifyDataErrorInfo. (В моей первоначальной версии ViewModel реализовал INotifyDataErrorInfo. Это больше не так, поскольку я пытаюсь добиться тех же результатов с помощью композиции.)
public class MyViewModel : ViewModel
{
public NotifyDataErrorInfo NotifyDataErrorInfo { get; } = new NotifyDataErrorInfo();
}
Вот текстовое поле, которое сообщает об ошибках проверки в установщике свойства MaxDaysText и задает шаблон ошибки проверки.
<TextBox
Text="{Binding MaxDaysText, UpdateSourceTrigger=PropertyChanged}"
Validation.ErrorTemplate="{StaticResource TextBoxValidationErrorTemplate}" />
Теперь мне нужно обновить шаблон ошибки проверки, чтобы получить доступ к ошибкам в свойстве NotifyDataErrorInfo, но я не знаю, как это сделать.
<ControlTemplate x:Key="TextBoxValidationErrorTemplate">
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<Border
Grid.Row="0"
HorizontalAlignment="Left"
BorderBrush="{StaticResource ErrorMessageBorderBrush}"
BorderThickness="1">
<AdornedElementPlaceholder x:Name="_adornedElementPlaceholder" />
</Border>
<ItemsControl
Grid.Row="1"
ItemsSource="{Binding}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBox
Style="{StaticResource ErrorMessageStyle}"
Text="{Binding Path=ErrorContent, Mode=OneWay}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
</ControlTemplate>
Я попытался изменить все привязки для поиска NotifyDataErrorInfo, но безуспешно. Какие изменения мне нужно внести в шаблон, чтобы получить доступ к ошибкам проверки в свойстве NotifyDataErrorInfo MyViewModel?
РЕДАКТИРОВАТЬ: кажется, что в подходе композиции ErrorsChanged всегда имеет значение null, и представление никогда не уведомляется. Я предполагаю, что когда сама модель представления реализует INotifyDataErrorInfo, фреймворк назначает делегата с помощью ErrorsChangedEventManager. Но теперь я оставляю это в стороне. Таким образом, кажется, что композиция не будет работать для этого подхода. Верна ли эта оценка?