内部にTextBoxを持つUserControlがあります。TextBox レベルでエラーが発生したときに、 UserControl レベルでメッセージを表示したい。また、TexBox レベルでエラー メッセージも表示します。
MVVM は使用していません。これは再利用可能なコントロールです。ただし、これは再利用可能なコントロールであり、それを使用するユーザーは、MVVM 自体を使用する可能性があります。
次のようにビューに追加します。
<myUserControlNamespace:MyUserControl x:Name="control1" Value="{Binding Value}" OtherProperty="{Binding OtherValue}" />
内部の私のコントロールには、「値」にバインドされた TexBox があります。値は Double であるため、ユーザーが TexBox に文字を入力すると、エラーがスローされます。私の TextBox は次のようにバインドされています。
<TextBox Grid.Column="1" x:Name="valueTextBox" Style="{DynamicResource ValidatingTextBox}"
Validation.ValidationAdornerSite="{Binding ElementName=valueTextBox}"
Validation.ValidationAdornerSiteFor="{Binding}" >
<TextBox.Text>
<MultiBinding Converter="{StaticResource MyConverter}"Mode="TwoWay" >
<Binding RelativeSource="{RelativeSource AncestorType={x:Type unitConversion:UnitConversionControl}}" UpdateSourceTrigger="PropertyChanged" Path="Value" Mode="TwoWay" />
<Binding RelativeSource="{RelativeSource AncestorType={x:Type unitConversion:UnitConversionControl}}" Path="OtherProperty"/>
</MultiBinding>
</TextBox.Text>
Style ValidatingTexBox には次のようなものがあります。
<Style x:Key="ValidatingTextBox" TargetType="{x:Type TextBox}">
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<StackPanel Orientation="Vertical">
<AdornedElementPlaceholder />
<TextBlock Foreground="Red" Text="{Binding ErrorContent}" Height="16" Margin="2"/>
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="True">
<Setter Property="Background"
Value="LightPink" />
<Setter Property="Foreground"
Value="Black" />
<Setter Property="Margin" Value="5,5,5,28"/>
<Setter Property="ToolTip"
Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}" />
</Trigger>
</Style.Triggers>
クライアントのユーザーに、TextBox を使用するのと同様の方法でコントロールを使用してもらいたいと考えています。MyUserControl スタイルを設定し、Validation.ErrorTemplate を使用してエラーを表示します。
TexBox にエラーがある場合、コントロールにもエラーが発生するようにしたいので、コントロールを使用しているユーザーは、たとえば Validation.ErrorTemplate を使用してエラーを処理できます。
エラーを「カスケード」する方法はありますか?
私はこのSOの質問を読みました.彼はINotifyDataErrorInfoを使用しています.Net 4.0を使用しているためできませんが、代わりに IDataErrorInfo を使用できることを読みました コントロールに IDataErrorInfo を実装させる必要があります。これは正しいです?
さらに詳細を追加する必要がある場合はお知らせください。