M-V-VMでIDataErrorInfoを使用する
-
19-08-2019 - |
質問
ドメインオブジェクトが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>
WPF Application Framework(WAF) BookLibrary サンプルアプリケーション> はあなたにとって興味深いかもしれません。ドメインオブジェクトにもIDataErrorInfoインターフェイスを実装し、M-V-VMパターンを使用します。