如果我的域对象实现了IDataErrorInfo,并且我使用的是M-V-VM,那么如何通过ViewModel将错误传播到View?如果我直接绑定到模型,我会在绑定时将“ValidateOnExceptons”和“ValidateOnErrors”属性设置为true。但是我的ViewModel没有实现IDataErrorInfo。只有我的模特。我该怎么办?
澄清 我正在处理在域对象中实现IDataErrorInfo的现有代码库。我不能在我的视图模型中实现IDataErrorInfo。
答案 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模式。