Использование IDataErrorInfo в M-V-VM - PullRequest
12 голосов
/ 04 декабря 2008

Если мои доменные объекты реализуют IDataErrorInfo, и я использую M-V-VM, как я могу распространять ошибки через ViewModel в View? Если бы я связывался напрямую с моделью, я бы установил для свойств привязки свойства ValidateOnExceptons и ValidateOnErrors в значение true. Но моя ViewModel не реализует IDataErrorInfo. Только моя модель. Что мне делать?

Разъяснение Я имею дело с существующей кодовой базой, которая реализует IDataErrorInfo в объектах домена. Я не могу просто реализовать IDataErrorInfo в моей модели представления.

Ответы [ 4 ]

18 голосов
/ 08 декабря 2008

Вы можете дополнительно реализовать IDataErrorInfo в вашей виртуальной машине и направлять вызовы к виртуальной машине в соответствующие объекты вашего домена. Я думаю, что это единственный способ не подвергать доменные объекты непосредственному представлению.

7 голосов
/ 04 декабря 2008

если вы используете M-V-VM, ViewModel должен определять интерфейс IDataErrorInfo, а не модель.

Можно сказать, что интерфейс IDataErrorInfo предназначен только для представления и не относится к модели, но это вопрос стиля.

Самым простым ответом будет использование ViewModel интерфейса IDataErrorInfo и распространение ошибок из модели.

3 голосов
/ 20 октября 2009

На эту тему есть хорошая статья в журнале 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>


0 голосов
/ 06 июля 2010

Пример приложения BookLibrary из WPF Application Framework (WAF) может быть вам интересен. Он также реализует интерфейс IDataErrorInfo для объектов домена и использует шаблон M-V-VM.

...