12

ドメイン オブジェクトが IDataErrorInfo を実装していて、MV-VM を使用している場合、ViewModel を介してビューにエラーを伝達するにはどうすればよいですか? モデルに直接バインドする場合は、バインディングで "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

このトピックに関する優れたMSDNMagazineの記事、Model-View-ViewModelデザインパターンを備えた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 に答える