現在、WPF Validation を使用して MVVM ソリューションに取り組んでいます。
私がやりたいことは、コンテキストで「ShowErrors」可視性プロパティを使用して、検証アドナーがいつ表示されるかを制御できるようにすることです。
Application.xaml ファイルに含まれる WPF ComboBox Validation Adorners の次のテンプレートがあります。
<Style TargetType="{x:Type ComboBox}">
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Margin" Value="0,2,40,2" />
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<DockPanel LastChildFill="true">
<Border Background="Red" DockPanel.Dock="right" Margin="5,0,0,0" Width="20" Height="20" CornerRadius="10"
ToolTip="{Binding ElementName=customAdorner1, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}">
<TextBlock Text="!" VerticalAlignment="center" HorizontalAlignment="center" FontWeight="Bold" Foreground="white">
</TextBlock>
</Border>
<AdornedElementPlaceholder Name="customAdorner1" VerticalAlignment="Center" >
<Border BorderBrush="red" BorderThickness="1" />
</AdornedElementPlaceholder>
</DockPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
(TextBox 用の別のテンプレートがあります)
StackOverflow と Google で検索を行った後、DockPanel に以下を追加してみました。
Visibility="{Binding DataContext.ShowErrors, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Mode=TwoWay}"
しかし、同じ方法がメイン XAML 内から正常に機能するにもかかわらず、これは私にとってはうまくいかないようです..何かアイデアはありますか?
編集: DataContext をバインドする UserControl の x:Name は "MainContext" です。
提案するいくつかの広告を見つけました。
Visibility="{Binding DataContext.ShowErrors, Source={x:Reference Name=MainContext}, Mode=TwoWay}">
次のエラーが発生します
未解決の参照 'MainContext'
としても;
Visibility="{Binding DataContext.ShowErrors, ElementName=MainContext, Mode=TwoWay}">
これはうまくいきません。
Edit2 : アドナー全体を Appliation.xaml から UserControl リソースに移動する場合は、次を使用します。
Visibility="{Binding DataContext.ShowErrors, ElementName=MainContext, Mode=TwoWay}">
それは機能します...ただし、すべての画面でテンプレートを繰り返す必要がないため、理想的ではありません
編集 3:わかりましたので、今のところ回避策を見つけました。Visibility Binding には以下を使用しました...
Visibility="{Binding ElementName=customAdorner1, Path=AdornedElement.Parent.DataContext.ShowErrors, Converter={StaticResource MyBolVisibilityConverter}, Mode=TwoWay}"
次に、Boolean の ShowErrors プロパティをコンテキストに追加し、Boolean 値から Visibility 値に変換する Converter を追加しました。これは、主に ShowErrors プロパティが実際にどこに到達したかが原因です。
私のフォームは、独自の DataContext を持つ詳細セクション内に Adorners が表示されるマスター詳細配置であるため、これは少し混乱しました。もちろん、これは UserControl の DataContext に直接アクセスできません。
これは私にはちょっとしたハックのように思えるので、より良い解決策をいただければ幸いです!