Использование IDataErrorInfo в M-V-VM

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

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


person Micah    schedule 04.12.2008    source источник


Ответы (4)


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

person MarioH    schedule 08.12.2008
comment
Что вы используете для маршрутизации вызовов к реализации виртуальной машины из привязанного объекта? - person TheCodeKing; 13.09.2010
comment
Не реализовал, но думаю придется вручную - person MarioH; 16.09.2010
comment
Хм, это не работает, я ищу способ сказать WPF искать IDataErrorInfo в модели представления. - person TheCodeKing; 18.09.2010

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

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

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

person gcores    schedule 04.12.2008
comment
Тот же вопрос, что и выше, как распространить ошибки от объекта на модель veiwmodel? Вам удалось это сделать? - person TheCodeKing; 18.09.2010
comment
Этот ответ противоречит лучшим практикам MS (msdn.microsoft .com / en-us / library / gg405484 (v = PandP.40) .aspx): Как правило, в модели реализованы средства, упрощающие привязку к представлению. Обычно это означает, что он поддерживает уведомление об изменении свойства и коллекции через интерфейсы INotifyPropertyChanged и INotifyCollectionChanged. Модель также может поддерживать проверку данных и сообщение об ошибках через интерфейсы IDataErrorInfo (или INotifyDataErrorInfo). Эти интерфейсы позволяют уведомлять привязку данных WPF и Silverlight при изменении значений, чтобы пользовательский интерфейс можно было обновить. - person Pat; 01.12.2010
comment
@Pat Я не уверен, что согласен с этим. Модель не должна быть засорена проблемами пользовательского интерфейса. Реализация пары интерфейсов в модели только для того, чтобы сделать UI счастливым, кажется неправильным, для этого и предназначена ViewModel. Опять же, все зависит от сложности модели, размера и типа проекта и т. Д. Я не думаю, что есть верный ответ. Но я бы постарался очистить модель от любых проблем, выходящих за рамки бизнес-логики. - person gcores; 02.12.2010
comment
@gcores Это то же самое, что я чувствую, но я просто указывал на то, каким кажется ответ Microsoft (хотя и не вполне обоснованный ответ). - person Pat; 02.12.2010

По этой теме в журнале MSDN есть хорошая статья WPF Apps With The Model-View-ViewModel Design Pattern: 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>


person artur02    schedule 19.10.2009

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

person jbe    schedule 05.07.2010