Использование IDataErrorInfo в M-V-виртуальной машине
-
19-08-2019 - |
Вопрос
Если объекты моего домена реализуют IDataErrorInfo, и я использую M-V-VM, как мне распространить ошибки через ViewModel в представление?Если бы я привязывался непосредственно к модели, я бы установил для свойств "ValidateOnExceptons" и "ValidateOnErrors" значение true в моей привязке.Но моя ViewModel не реализует IDataErrorInfo.Только моя модель.Что мне делать?
Разъяснение Я имею дело с существующей кодовой базой, которая реализует IDataErrorInfo в объектах домена.Я не могу просто реализовать IDataErrorInfo в модели my view.
Решение
Вы можете дополнительно реализовать IDataErrorInfo в своей виртуальной машине и направлять вызовы виртуальной машины к соответствующим объектам вашего домена.Я думаю, что это единственный способ не выставлять объекты домена непосредственно в поле зрения.
Другие советы
если вы используете M-V-VM, ViewModel должен определять интерфейс IDataErrorInfo, а не модель.
Вы могли бы сказать, что интерфейс IDataErrorInfo предназначен только для представления и ему не место в модели, но это вопрос стиля.
Самым простым ответом было бы, если бы ViewModel реализовал интерфейс IDataErrorInfo и распространял ошибки из модели.
На эту тему есть хорошая статья в журнале MSDN, приложения WPF с шаблоном проектирования Model-View-ViewModel: http://msdn.microsoft.com/en-us/magazine/dd419663.aspx
Согласно этой статье, в разделе "Модель данных и репозиторий" (http://msdn.microsoft.com/en-us/magazine/dd419663.aspx#id0090102) вы найдете простую реализацию.Клиент - это класс сущности, и ViewModel получает индикаторы ошибок от сущности.
Вы можете использовать ValidationsRule для проверки достоверности данных:
<TextBox x:Name="title" VerticalAlignment="Top" TextWrapping="Wrap" Grid.Column="1" MinWidth="20">
<TextBox.Text>
<Binding Path="Title" UpdateSourceTrigger="LostFocus">
<Binding.ValidationRules>
<Validators:StringRangeValidationRule MinimumLength="1" MaximumLength="30"
ErrorMessage="Address is required and must be less than 30 letters." />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
Это пример оформления валидатора:
<Application.Resources>
<Style TargetType="{x:Type TextBox}">
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<DockPanel LastChildFill="True">
<Image Source="/Images/error.png" Width="25" Height="25" ToolTip="{Binding ElementName=MyAdorner, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}" />
<TextBlock DockPanel.Dock="Right"
Foreground="Orange"
Margin="5"
FontSize="12pt"
Text="{Binding ElementName=MyAdorner, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}">
</TextBlock>
<Border BorderBrush="Red" BorderThickness="3">
<AdornedElementPlaceholder Name="MyAdorner" />
</Border>
</DockPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="true">
<Setter Property="ToolTip"
Value="{Binding RelativeSource={RelativeSource Self},
Path=(Validation.Errors)[0].ErrorContent}"/>
</Trigger>
</Style.Triggers>
Тот самый Книжная библиотека пример применения Платформа приложений WPF (WAF) может быть, это будет интересно для вас.Он также реализует интерфейс IDataErrorInfo для объектов домена и использует шаблон M-V-VM.