12

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

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

4

4 回答 4

18

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

于 2008-12-08T15:17:54.640 回答
7

如果你使用 MV-VM,ViewModel 应该定义 IDataErrorInfo 接口,而不是模型。

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

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

于 2008-12-04T19:55:07.347 回答
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>


于 2009-10-19T22:07:48.343 回答
0

WPF 应用程序框架 (WAF)BookLibrary示例应用程序可能会让您感兴趣。它也在域对象上实现了 IDataErrorInfo 接口,并使用了 MV-VM 模式。

于 2010-07-05T20:18:47.030 回答