ToolTips 的棘手之处在于 ToolTip 是与控件关联的对象,而不是控件可视树的一部分。所以你不能像在可视化树中填充东西那样填充它,例如:
<TextBox.ToolTip>
<StackPanel>
...put bound controls here
</StackPanel>
</TextBox.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 使用这种样式,它从TextBox 的绑定源的ValidationError 属性中获取其内容:
<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 的可视化树中明确设置。但我可能没有想到什么重要的事情。