在M-V-VM中使用IDataErrorInfo

时间:2008-12-04 19:42:16

标签: wpf validation mvvm idataerrorinfo

如果我的域对象实现了IDataErrorInfo,并且我使用的是M-V-VM,那么如何通过ViewModel将错误传播到View?如果我直接绑定到模型,我会在绑定时将“ValidateOnExceptons”和“ValidateOnErrors”属性设置为true。但是我的ViewModel没有实现IDataErrorInfo。只有我的模特。我该怎么办?

澄清 我正在处理在域对象中实现IDataErrorInfo的现有代码库。我不能在我的视图模型中实现IDataErrorInfo。

4 个答案:

答案 0 :(得分:18)

您可以在VM中另外实施IDataErrorInfo,并将对VM的调用路由到相应的域对象。我认为这是将域对象直接暴露给视图的唯一方法。

答案 1 :(得分:7)

如果您使用的是M-V-VM,ViewModel应该定义IDataErrorInfo接口,而不是模型。

您可以说IDataErrorInfo接口仅适用于视图,并且它不属于模型,但这是样式问题。

让ViewModel实现IDataErrorInfo接口并从模型传播错误将是最简单的答案。

答案 2 :(得分:3)

MSDN杂志上有一篇关于此主题的文章,带有模型 - 视图 - 视图模型设计模式的WPF应用程序:http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

根据这篇文章,在数据模型和存储库部分(http://msdn.microsoft.com/en-us/magazine/dd419663.aspx#id0090102)中,您将找到一个简单的实现。 Customer是实体类,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>


答案 3 :(得分:0)

WPF Application Framework (WAF) BookLibrary 示例应用程序可能对您有意义。它还在域对象上实现IDataErrorInfo接口,并使用M-V-VM模式。