11

エキスパンダー内にあるTextBoxのデータソースで検証を行っていますが、検証エラーがトリガーされると、エキスパンダーを折りたたむと、赤いボックスがTextBoxのある場所にとどまることがわかりました。

<Expander Header="Blah Blah Blah">
  <TextBox Name="TextBox"
           Validation.ErrorTemplate="{DynamicResource TextBoxErrorTemplate}"
           Text="{Binding Path=Blah,
                          UpdateSourceTrigger=PropertyChanged,
                          ValidatesOnDataErrors=True}" />
</Expander>

エラーテンプレートの可視性をエキスパンダーにバインドすることでこれを回避しようとしましたが、バインドに問題があると思います。

<local:NotVisibleConverter x:Key="NotVisibleConverter" />

<ControlTemplate x:Key="TextBoxErrorTemplate">
  <DockPanel>
    <Border BorderBrush="Red" BorderThickness="2" 
            Visibility="{Binding Path=IsExpanded, 
                                 Converter={StaticResource NotVisibleConverter}, 
                                 RelativeSource={RelativeSource AncestorType=Expander}}" >
      <AdornedElementPlaceholder Name="MyAdorner" />
    </Border>
  </DockPanel>
  <ControlTemplate.Triggers>
    <Trigger Property="Validation.HasError" Value="true">
        <Setter Property="ToolTip"
                Value="{Binding RelativeSource={RelativeSource Self}, 
                                Path=(Validation.Errors)[0].ErrorContent}"/>
    </Trigger>
  </ControlTemplate.Triggers>
</ControlTemplate>

バインディングが間違っていると思いますが、誰かが私を軌道に戻すことができますか?あるいは、エキスパンダーの折りたたみ時にまだ表示されているErrorTemplateの別の解決策を知っている人はいますか?

4

3 に答える 3

25

バインディングを行うのではなくAdornerDecorator、エキスパンダー内の要素の周りに配置することができます。ご覧のとおり、検証エラーテンプレートは、他のすべての上に表示されるように装飾レイヤーに配置されます。それが最終的にあなたの問題です。エキスパンダーが閉じているためにテキストボックスが表示されていなくても、エラーテンプレートはまだ装飾レイヤーにあります。

次のxamlでこれを修正できると思います。

<Expander Header="Blah Blah Blah">
   <AdornerDecorator>
      <TextBox Name="TextBox"
               Validation.ErrorTemplate="{DynamicResource TextBoxErrorTemplate}"
               Text="{Binding Path=Blah,
                              UpdateSourceTrigger=PropertyChanged,
                              ValidatesOnDataErrors=True}" />
   </AdornerDecorator>
</Expander>

これにより、エクスパンダー内専用の装飾レイヤーが作成されます。エキスパンダーを閉じると、エキスパンダーAdornerDecoratorも非表示になり、すべてが非表示になります。

于 2009-09-24T13:37:51.820 に答える
1

一般に、バインディングのデバッグは次の方法で実行できます。

  1. コンバーターにブレークポイントを固定する(使用している場合は、使用している)
  2. 無効なバインディングに関するデバッグ警告がないか、VisualStudioの[出力]ペインを確認します

あなたが投稿したコードでは、SetterのValueプロパティは依存関係プロパティではないため、バインドできないためだと思います。

これについて考えて、もっと役立つものを考え出すことができるかどうかを確認します。

于 2009-09-24T13:40:04.780 に答える
1

wpfバインディングの検証が失敗し、含まれているパネルが表示されなくなったときに赤い長方形を取り除くにはどうすればよいですか?でDonnelleの回答を確認してください。。それはエキスパンダーで私のために働いた。

于 2009-10-08T14:26:57.850 に答える