2

現在、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 に直接アクセスできません。

これは私にはちょっとしたハックのように思えるので、より良い解決策をいただければ幸いです!

4

1 に答える 1

2

これを解決するには、ShowErrorsBoolean プロパティを DataContext に追加し、Adorner の可視性を AdornedElement の Parents DataContext にバインドします。これはもちろん、既知の DataContext の場合です。

Application.xaml ファイルで次の XAML を使用しました。

<Converters:BolVisibilityConverter x:Key="MyBolVisibilityConverter"/>
<Style TargetType="{x:Type TextBox}">
      <Setter Property="VerticalAlignment" Value="Center" />
      <Setter Property="Margin" Value="0,2,40,2" />
      <Setter Property="Validation.ErrorTemplate">
          <Setter.Value>
              <ControlTemplate>
                        <DockPanel LastChildFill="true" Visibility="{Binding ElementName=customAdorner, Path=AdornedElement.Parent.DataContext.ShowErrors, Converter={StaticResource MyBolVisibilityConverter}, Mode=TwoWay}">
                            <Border Background="Red" DockPanel.Dock="right" Margin="5,0,0,0" Width="20" Height="20" CornerRadius="10"
                            ToolTip="{Binding ElementName=customAdorner, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}">
                                <TextBlock Text="!" VerticalAlignment="center" HorizontalAlignment="center" FontWeight="Bold" Foreground="white">
                                </TextBlock>
                          </Border>
                          <AdornedElementPlaceholder Name="customAdorner" VerticalAlignment="Center" >
                         <Border BorderBrush="red" BorderThickness="1" />
                       </AdornedElementPlaceholder>
                   </DockPanel>
               </ControlTemplate>
           </Setter.Value>
      </Setter>
</Style>

次のコンバーター コードを使用しました。

Namespace Converters

    Public Class BolVisibilityConverter
        Implements IValueConverter

        Public Function Convert(value As Object, targetType As Type, parameter As Object, culture As Globalization.CultureInfo) As Object Implements IValueConverter.Convert

            If value Is Nothing OrElse value = False Then

                Return Visibility.Hidden

            Else

                Return Visibility.Visible

            End If

        End Function

        Public Function ConvertBack(value As Object, targetType As Type, parameter As Object, culture As Globalization.CultureInfo) As Object Implements IValueConverter.ConvertBack
            Return DirectCast(value, Boolean)

        End Function
    End Class

End Namespace

次に、Adorner を表示または非表示にするために、DataContext の ShowErrors プロパティを True または False に設定するだけです。

アドナーは常に最上層に表示され、カスタム ダイアログ ボックスなどの上に表示されるため、これは非常に便利でした。

于 2013-02-03T22:10:02.243 に答える