質問

ドメインオブジェクトがIDataErrorInfoを実装し、M-V-VMを使用している場合、ViewModelを介してビューにエラーを伝播するにはどうすればよいですか?モデルに直接バインドしている場合、<!> quot; ValidateOnExceptons <!> quot;を設定します。および<!> quot; ValidateOnErrors <!> quot;バインディングのプロパティをtrueにします。しかし、私のViewModelはIDataErrorInfoを実装していません。私のモデルのみ。私は何をしますか?

明確化 ドメインオブジェクトにIDataErrorInfoを実装する既存のコードベースを扱っています。ビューモデルにIDataErrorInfoを実装することはできません。

役に立ちましたか?

解決

VMにIDataErrorInfoを追加で実装し、VMへの呼び出しを対応するドメインオブジェクトにルーティングできます。これは、ドメインオブジェクトをビューに直接公開しない唯一の方法だと思います。

他のヒント

M-V-VMを使用している場合、ViewModelはモデルではなくIDataErrorInfoインターフェイスを定義する必要があります。

IDataErrorInfoインターフェースはビュー専用であり、モデルに属していないと言えますが、それはスタイルの問題です。

ViewModelにIDataErrorInfoインターフェイスを実装させ、モデルからエラーを伝播させるのが最も簡単な答えです。

このトピックに関するMSDNマガジンの優れた記事、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>


scroll top