WPF - 在自定义用户控件上无法绑定ToolTip文本

时间:2010-12-01 18:08:49

标签: c# wpf xaml user-controls binding

我正在创建一个简单的用户控件;只是一个ImageButton。

我已经成功将图像绑定到按钮,所以我决定添加一个工具提示。现在我遇到了麻烦。似乎我可以在XAML中为控件硬编码工具提示的文本,但是当它绑定时它返回一个空字符串。

这是我控制的XAML:

<Button x:Class="BCOCB.DACMS.Controls.ImageButton"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300"
        Name="this"
        Style="{StaticResource DisabledButton}">

    <Image Source="{Binding ElementName=this, Path=Source}" />    
    <Button.ToolTip>
        <TextBlock Text="{Binding ElementName=this, Path=ToolTipText}" />
    </Button.ToolTip>
</Button>

这是工具提示文本的依赖属性信息:

public static readonly DependencyProperty ToolTipTextProperty = DependencyProperty.Register("ToolTipText", typeof(string), typeof(ImageButton));
public string ToolTipText
{
  get
  {
    return this.GetValue(ToolTipTextProperty) as string;
  }
  set
  {
    this.SetValue(ToolTipTextProperty, value);
  }
}

最后,在我的窗口中声明控件:

<controls:ImageButton x:Name="btnAdd" Source="/DACMS;component/Resources/plus.png" ToolTipText="Add New Item" Click="btnAdd_Click" />

正如我之前提到的,图像绑定得很好,我以完全相同的方式完成了它。

有什么想法吗?

谢谢,
桑尼

编辑:我现在有工作。我已经从绑定中删除了ElementName,并在instanciation后面的代码中设置了TextBlock的DataContext = this。不过,我想知道如何在XAML中解决这个问题。

5 个答案:

答案 0 :(得分:6)

我现在无法测试,但您可以尝试:

<Button.ToolTip
      DataContext=”{Binding Path=PlacementTarget.Parent.Parent,
                    RelativeSource={x:Static RelativeSource.Self}}"
>
    <TextBlock Text="{Binding Path=ToolTipText}" />
</Button.ToolTip>

您可能需要在PlacementTarget中使用“Parent”的数量进行一些实验。

希望这有效。我不喜欢给出我没有测试过的答案,但我没有在这台电脑上安装VS. :)

答案 1 :(得分:2)

我遇到了与ContextMenu绑定相同的问题。在我的研究之后,我认为这是因为ToolTip和ContextMenu不存在于您的页面/窗口/控件的可视树中。因此,DataContext不会被继承,并且会使绑定变得麻烦。

这是我发现的Xaml hack对我有用。

Binding to a MenuItem in a WPF Context Menu

答案 2 :(得分:1)

通过xaml将数据上下文设置为“this”的方式如下所示:

<Control DataContext={Binding RelativeSource={RelativeSource Self}}>

另外一点,wpf按钮允许他们的内容几乎是你想要的任何(单个)事物。如果你想要除文本之外的其他东西(即文本和图像),它看起来像这样:

<Button Name="SampleButton" Click="SampleButton_Click">
    <Grid Width="70" Height="62">
        <Label Content="SampleText"/>
        <Image Margin="3,3,3,3" Source="Graphics/sample.ico"/>
    </Grid>
</Button>

答案 3 :(得分:0)

由于除了工具提示TextBlock上的Text之外你没有更改任何内容,你可以使用内联声明为你生成TextBlock,并且不需要任何黑客来解决你遇到的名称范围问题否则:

<Button ... ToolTip="{Binding RelativeSource={RelativeSource Self}, Path=ToolTipText}">...

您可以在Image上设置ToolTip并将控件用作DataContext,它可以解决名称范围问题。 DataContext将传递给ToolTip,允许正常绑定:

<Image DataContext="{Binding ElementName=this}" Source="{Binding Source}">
    <Image.ToolTip>
        <TextBlock FontSize="18" Text="{Binding Path=ToolTipText}" />
    </Image.ToolTip>
</Image>

这种方式允许在TextBlock或更复杂的视觉效果上进行其他设置。

答案 4 :(得分:0)

这解决了Tooltip Bindings和Dependencies属性的问题:

<UserControl x:Class="Extended.InputControls.TextBoxUserControl" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:Extended.InputControls"
    x:Name="UserControl"
    DataContext="{Binding RelativeSource={RelativeSource Self}}">
    <TextBox x:Name="textBox">
        <TextBox.ToolTip>
            <ToolTip Content="{Binding Path=CustomToolTip}" Background="Yellow"/>
        </TextBox.ToolTip>
    </TextBox>
</UserControl>

而不是这个(不起作用):

<UserControl x:Class="Extended.InputControls.TextBoxUserControl" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:Extended.InputControls"
    x:Name="UserControl">
    <TextBox x:Name="textBox">
        <TextBox.ToolTip>
            <ToolTip Content="{Binding ElementName=UserControl, Path=CustomToolTip}" Background="Yellow"/>
        </TextBox.ToolTip>
    </TextBox>
</UserControl>