关于ToolTip
的棘手之处在于,它是一个与控件相关联的对象,并不是控件的可视树的一部分。因此,您无法像填充可视树中的元素那样填充它,例如:
<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
使用这种样式,该样式从 TextBox
的绑定源的 ValidationError
属性获取其内容:
<Style x:Key="ErrorToolTipStyle" TargetType="">
<Setter Property="OverridesDefaultStyle" Value="true"/>
<Setter Property="HasDropShadow" Value="True"/>
<Setter Property="DataContext" Value="}"/>
<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=""/>
</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
的可视树中明确设置即可。但我可能没有考虑到重要的事情。