ToolTip
sについて注意が必要なのは、aToolTip
がコントロールに関連付けるオブジェクトであり、コントロールのビジュアル ツリーの一部ではないことです。したがって、ビジュアル ツリーにデータを入力する方法でデータを入力することはできません。たとえば、次のようになります。
<TextBox.ToolTip>
<StackPanel>
...put bound controls here
</StackPanel>
</TextBox.ToolTip>
代わりに、ToolTip の特定のインスタンスを作成し、それを設定するスタイルを割り当てる必要がありますDataContext
(非常に重要です。これが、「配置ターゲット」、つまりコントロールのデータ ソースのプロパティにバインドする方法です)。ツールチップを表示している) とそのTemplate
. ToolTip
次に、バインディングを含むのビジュアル ツリーをテンプレートに入れます。最後に、ToolTip
コントロールで を参照します。
したがって、検証TextBox
を行う人は次のとおりです。Binding
<TextBox ToolTip="{StaticResource ErrorToolTip}">
<TextBox.Text>
<Binding Source="SourceProperty">
<Binding.ValidationRules>
<DataErrorValidationRule/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
これを使用しますToolTip
:
<ToolTip x:Key="ErrorToolTip" Style="{StaticResource ErrorToolTipStyle}"/>
そして は、のバインディング ソースのプロパティToolTip
からコンテンツを取得するこのスタイルを使用します。ValidationError
TextBox
<Style x:Key="ErrorToolTipStyle" TargetType="{x:Type ToolTip}">
<Setter Property="OverridesDefaultStyle" Value="true"/>
<Setter Property="HasDropShadow" Value="True"/>
<Setter Property="DataContext" Value="{Binding Path=PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ToolTip">
<Border
Name="Border"
BorderThickness="1"
BorderBrush="LightGray">
<StackPanel Orientation="Vertical">
<Label Background="Firebrick" Foreground="White" FontWeight="Bold" Margin="4">Validation error</Label>
<TextBlock Margin="10" Text="{Binding ValidationError}"/>
</StackPanel>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="HasDropShadow" Value="true">
<Setter TargetName="Border" Property="CornerRadius" Value="4"/>
<Setter TargetName="Border" Property="SnapsToDevicePixels" Value="true"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
これについては確信が持てませんが、実際にスタイルに設定する必要がある上記の唯一の部分は、 ;のDataTrigger
設定だけだと思います。他のほとんどすべては、のビジュアル ツリーDataContext
で明示的に設定できると思います。ToolTip
でも、きっと大事なことを考えていない。