WPF提示绑定

13

我只学习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>

谢谢。

3个回答

30

关于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="{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>

我不确定,但我认为上面的唯一必须在样式中设置的部分是设置DataTriggerDataContext;我认为大多数其他内容只需在ToolTip的可视树中明确设置即可。但我可能没有考虑到重要的事情。


提示:无论您将其放入本地资源(UserControl.Resources)还是全局字典中,请确保在<Tooltip>之前定义<Style>。资源不允许进行前向引用。如果没有这样做,您将得到一个无法解决的引用,如果您按照上面显示的顺序复制代码,则可能不会立即显而易见。 - Simon_Weaver
你也可以使用动态引用而不是静态引用,但通常情况下,你希望在使用样式之前定义它们。 - Robert Rossney
非常棒的答案,谢谢!甚至不需要样式,您可以直接将绑定应用于“DataContext”属性。 - Artfunkel

23
<Label Content={Binding Path=Id} ToolTip={Binding Path=Name}/>

只需试试这个


2
我该如何制作一个更详细的工具提示呢?一个可以显示多个属性的工具提示。 - Nathan
1
请参考此链接,它将对您有所帮助:https://dev59.com/IUrSa4cB1Zd3GeqPXpdY - Kishore Kumar

5
这是一个准备好的kaxaml示例,包括一个比纯文本更精细的工具提示:
```html

这是一个准备好的kaxaml示例,包括一个比纯文本更精细的工具提示:

```
<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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接