s的棘手之ToolTip
处在于 aToolTip
是您与控件关联的对象,而不是控件可视树的一部分。所以你不能像在可视化树中填充东西那样填充它,例如:
<TextBox.ToolTip>
<StackPanel>
...put bound controls here
</StackPanel>
</TextBox.ToolTip>
相反,您需要做的是创建工具提示的特定实例,并为其分配一个样式来设置其DataContext
(非常重要;这就是您可以绑定到其“放置目标”的数据源的属性的方式,即控件显示工具提示)及其Template
. 然后将 的可视化树ToolTip
,包括绑定,放入模板中。最后,ToolTip
在您的控件中引用 。
所以,这是一个TextBox
who Binding
do 验证:
<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
's 的可视化树中。但我可能没有想到什么重要的事情。