我进入WPF仅两周,所以这可能是一个微不足道的问题。我有一个集合“CellList”,它有一些我希望绑定到ToolTip
的属性,所以当我将鼠标悬停在标签上时,显示当前CellList
实例的信息。我怎么做?我理解简单的绑定,这也许是简单的绑定,但我无法绕过它。下面是我的XAML标签。有人可以向我解释我是如何做到这一点的。
<HierarchicalDataTemplate>
<ListBox ItemsSource="{Binding CellList}">
<ListBox.ItemTemplate>
<DataTemplate>
<Label Content=" " Height="20" Width="15" Background="{Binding Path=ExptNameBkg, Converter={StaticResource ExptNameToBrushConverter}}" BorderBrush="Black" BorderThickness="1" >
</Label>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</HierarchicalDataTemplate>
感谢。
答案 0 :(得分:22)
关于ToolTip
的棘手问题是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
使用此样式,该样式从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
的可视化树中明确设置。但我可能没想到重要的事情。
答案 1 :(得分:18)
<Label Content={Binding Path=Id} ToolTip={Binding Path=Name}/>
试试这个
答案 2 :(得分:4)
这是一个kaxaml-ready示例,其中包含一个比文本更精细的工具提示:
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Page.Resources>
<XmlDataProvider x:Key="CharacterData">
<x:XData>
<Data xmlns="">
<Character First="Bart" Last="Simpson" Background="LightGreen" />
<Character First="Homer" Last="Simpson" Background="LightBlue" />
<Character First="Lisa" Last="Simpson" Background="Pink" />
<Character First="Maggie" Last="Simpson" Background="Yellow" />
<Character First="Marge" Last="Simpson" Background="PapayaWhip" />
</Data>
</x:XData>
</XmlDataProvider>
<ToolTip x:Key="ElaborateToolTip">
<Grid Margin="5">
<Rectangle RadiusX="6" RadiusY="6" Fill="{Binding XPath=@Background}" />
<StackPanel Orientation="Horizontal" Margin="10">
<TextBlock Text="{Binding XPath=@First}" Margin="0,0,6,0" />
<TextBlock Text="{Binding XPath=@Last}" />
</StackPanel>
</Grid>
</ToolTip>
</Page.Resources>
<ListBox ItemsSource="{Binding Source={StaticResource CharacterData}, XPath=Data/Character}">
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="ToolTip" Value="{StaticResource ElaborateToolTip}" />
</Style>
</ListBox.ItemContainerStyle>
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding XPath=@First}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Page>