2

DataGridRow のデフォルト スタイルは次のとおりです。

<Style x:Key="{x:Type DataGridRow}" TargetType="{x:Type DataGridRow}">
  <Setter Property="Background" Value="{DynamicResource {x:Static 
                                      SystemColors.WindowBrushKey}}" />
    <Setter Property="SnapsToDevicePixels" Value="true"/>
    <Setter Property="Validation.ErrorTemplate" Value="{x:Null}" />
    <Setter Property="ValidationErrorTemplate">
    <Setter.Value>
      <ControlTemplate>
        <TextBlock Margin="2,0,0,0" VerticalAlignment="Center" 
                                    Foreground="Red" Text="!" />
      </ControlTemplate>
    </Setter.Value>
  </Setter>
  <Setter Property="Template">
      ... 
  </Setter>
</Style>

私が欲しいのは、「!」を表示する TextBlock に ToolTip を追加することです。行ヘッダーで、DataGridRow.Item.Error プロパティからエラー メッセージを取得します (私のエンティティ オブジェクトは IDataErrorInfo を実装しています)。だから私は次のことをしました:

<TextBlock Margin="2,0,0,0" VerticalAlignment="Center"
                            Foreground="Red" Text="!"
           ToolTip="{Binding RelativeSource={
                             RelativeSource FindAncestor,
                             AncestorType={x:Type DataGridRow}},
                             Path=Item.Error}"/>

ここまでは順調ですね。現在、Error プロパティは複数行の文字列を返すため、ToolTip に TextBlock を使用したいと考えています。

<TextBlock Margin="2,0,0,0" VerticalAlignment="Center"
                            Foreground="Red" Text="!">
  <TextBlock.ToolTip >
    <TextBlock Text="{Binding RelativeSource={
                              RelativeSource FindAncestor,
                              AncestorType={x:Type DataGridRow}},
                              Path=Item.Error}"
               TextWrapping="Wrap"/>
  </TextBlock.ToolTip>
</TextBlock>

ただし、上記はエラー メッセージを表示しません。問題は、ToolTip が親要素のビジュアル ツリーの一部ではないことです。PlacementTarget などについて読んだことがありますが、まだ仕事を終わらせることができませんでした。誰かが上記を行う適切な方法を教えてもらえますか?

4

2 に答える 2

2

問題は、要素自体ではなく、特定の要素のプロパティ (PlacementTarget) の相対ソースにバインドすることだと思います。ただし、RelativeSource マークアップ拡張機能は、特定の要素に対するバインディング ソースの位置を記述します。そこで、PlacementTarget を元のツールチップ ターゲットの先祖に設定しました。

<Setter Property="ValidationErrorTemplate">
  <Setter.Value>
    <ControlTemplate>
      <TextBlock Margin="2,0,0,0" VerticalAlignment="Center"
                 HorizontalAlignment="Center"
                 TextAlignment="Center"
                 Foreground="Red" Text="!"
                 ToolTipService.PlacementTarget="{Binding RelativeSource={
                              RelativeSource FindAncestor,
                              AncestorType={x:Type DataGridRow}}}">
        <TextBlock.ToolTip >
          <ToolTip DataContext="{Binding Path=PlacementTarget, 
                   RelativeSource={x:Static RelativeSource.Self}}">
            <TextBlock Text="{Binding Path=Item.Error}"/>
          </ToolTip>
        </TextBlock.ToolTip>
      </TextBlock>
    </ControlTemplate>
  </Setter.Value>
</Setter>

今では私が望んでいたように動作します。

于 2013-01-19T10:48:27.660 に答える
0

以下のように、そのテキストブロックで祖先レベルを使用します

          <TextBlock Text="{Binding RelativeSource={
                          RelativeSource FindAncestor,
                          AncestorType={x:Type DataGridRow},AncestorLevel=1},
                          Path=Item.Error}"
           TextWrapping="Wrap"/>
于 2013-01-18T11:55:05.393 に答える