2008-12-04 15 views
11

如果我的域對象實現IDataErrorInfo,並且我正在使用M-V-VM,那麼如何通過ViewModel將錯誤傳播到View中?如果我直接綁定到模型,我會在綁定時將「ValidateOnExceptons」和「ValidateOnErrors」屬性設置爲true。但是我的ViewModel沒有實現IDataErrorInfo。只有我的模特。我該怎麼辦?在M-V-VM中使用IDataErrorInfo

澄清 我正在處理在域對象中實現IDataErrorInfo的現有代碼庫。我不能只在我的視圖模型中實現IDataErrorInfo。

回答

17

您可以在虛擬機中另外實現IDataErrorInfo,並將呼叫路由到VM到相應的域對象。我認爲這是將域對象直接暴露給視圖的唯一方法。

6

如果您使用的是M-V-VM,ViewModel應該定義IDataErrorInfo接口,而不是模型。

你可以說IDataErrorInfo接口僅用於視圖,它不屬於模型,但這是一個風格問題。

使ViewModel實現IDataErrorInfo接口並從模型傳播錯誤將是最簡單的答案。

+0

與上面相同的問題,您如何將實體中的錯誤傳播給veiwmodel?你有沒有設法做到這一點? – TheCodeKing 2010-09-17 20:16:45

+3

這個答案與MS的最佳實踐相矛盾(http://msdn.microsoft.com/en-us/library/gg405484(v=PandP.40).aspx):通常,模型實現了易於綁定的工具到視圖。這通常意味着它通過INotifyPropertyChanged和INotifyCollectionChanged接口支持屬性和集合更改通知。該模型還可以通過IDataErrorInfo(或INotifyDataErrorInfo)接口支持數據驗證和錯誤報告。這些接口允許在值更改時通知WPF和Silverlight數據綁定,以便可以更新UI – Pat 2010-12-01 16:06:04

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> 


0

BookLibrary的示例應用程序WPF Application Framework (WAF)可能對您有興趣。它還在域對象上實現IDataErrorInfo接口,並使用M-V-VM模式。