2017-01-05 17 views
0

カスタムツールチップを作成しようとしています。問題は、エラーテキストを表示できないことです。このコードは完璧に動作します(簡単なツールチップ)カスタムツールチップの検証エラーWPF

<Style TargetType="{x:Type TextBox}" 
    BasedOn="{StaticResource {x:Type TextBox}}"> 
<Setter Property="Validation.ErrorTemplate"> 
    <Setter.Value> 
     <ControlTemplate> 
      <Grid> 
       <Polygon Fill="Red" 
         Margin="0,2,2,0" 
         Points="10,10 10,0 0,0" 
         VerticalAlignment="Top" 
         HorizontalAlignment="Right" 
         ToolTip="{Binding ElementName=adorner, Path=AdornedElement.(Validation.Errors).CurrentItem.ErrorContent}"> 
       </Polygon> 
       <AdornedElementPlaceholder x:Name="adorner" /> 
      </Grid> 
     </ControlTemplate> 
    </Setter.Value> 
</Setter> 

しかし、このコードは、動作しない、エラー

<Style TargetType="{x:Type TextBox}" 
    BasedOn="{StaticResource {x:Type TextBox}}"> 
<Setter Property="Validation.ErrorTemplate"> 
    <Setter.Value> 
     <ControlTemplate> 
      <Grid> 
       <Polygon Fill="Red" 
         Margin="0,2,2,0" 
         Points="10,10 10,0 0,0" 
         VerticalAlignment="Top" 
         HorizontalAlignment="Right"> 
        <Polygon.ToolTip> 
         <ToolTip Content="{Binding ElementName=adorner, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}" 
           BorderThickness="1" 
           Foreground="White" 
           Background="Red" /> 
        </Polygon.ToolTip> 
       </Polygon> 
       <AdornedElementPlaceholder x:Name="adorner" /> 
      </Grid> 
     </ControlTemplate> 
    </Setter.Value> 
</Setter> 

答えて

1

ツールヒント自体とAdornedElementPlaceholderは、異なる名前スコープに存在するため、ElementNameを使用したバインディングは機能しません。

しかし、PolygonのTagプロパティをErrorContentに設定し、TooltipのContentプロパティをPlacementTarget(Polygon)のTagプロパティにバインドすることができます。これは動作します:

<Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}"> 
    <Setter Property="Validation.ErrorTemplate"> 
     <Setter.Value> 
      <ControlTemplate> 
       <Grid> 
        <Polygon Fill="Red" 
         Margin="0,2,2,0" 
         Points="10,10 10,0 0,0" 
         VerticalAlignment="Top" 
         HorizontalAlignment="Right" 
         Tag="{Binding ElementName=adorner, Path=AdornedElement.(Validation.Errors).CurrentItem.ErrorContent}"> 
         <Polygon.ToolTip> 
          <ToolTip Content="{Binding PlacementTarget.Tag, RelativeSource={RelativeSource Self}}" 
           BorderThickness="1" 
           Foreground="White" 
           Background="Red" /> 
         </Polygon.ToolTip> 
        </Polygon> 
        <AdornedElementPlaceholder x:Name="adorner" /> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
0

(Validation.Errors)[0]への呼び出しは、のように面倒になりますが表示されません更新して変更するリストから特定のオブジェクトを参照しているため、バインディングが破られています。

(Validation.Errors).CurrentItem.を使用する最初の例は、動作する最初の実装と一致するため、より適しています。

これは数年前に問題が発生しましたが、絶対に100%確実に変更されない限り、基本的にバインディングでインデックスを使用しないでください。

+0

回答ありがとう、私はすでにそれを試みましたが、それは動作しませんでした。 – avechuche

+0

これは、独自のツールチッププロパティに与えられたテキストではなく、ツールチップオブジェクトが挿入されていることが原因です。 私が最初の例に戻し、それらの属性を操作するためのスタイルを使用しています。オブジェクト参照の手間を省くことができます。 スタイルを区切っておくのがよい方法であるため、これまで私のアプリケーションでこれを行っています。また、もしあなたが超クールに見えるようにしたいなら、あなたは動的にスワップすることができます。 – LiamHarries