You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Tooltip样式中使用依赖属性传递ViewModel数据?

当然可以实现和Button完全一致的逻辑!

你的思路没问题,问题出在Tooltip样式里的绑定写法错误——你直接把附加属性的路径当成了字符串文本,而不是用绑定语法去读取它的值。下面一步步帮你修正:

1. 确保附加属性代码正确

首先确认你的ToolTipAttachedProperty类实现正确(如果还没写,参考下面的代码):

using System.Windows;

public static class ToolTipAttachedProperty
{
    // 附加属性:Tooltip文本
    public static readonly DependencyProperty TextoProperty =
        DependencyProperty.RegisterAttached(
            "Texto",
            typeof(string),
            typeof(ToolTipAttachedProperty),
            new PropertyMetadata(string.Empty));

    // Getter方法
    public static string GetTexto(DependencyObject obj)
    {
        return (string)obj.GetValue(TextoProperty);
    }

    // Setter方法
    public static void SetTexto(DependencyObject obj, string value)
    {
        obj.SetValue(TextoProperty, value);
    }
}

2. 修正Tooltip的统一样式

Tooltip的特殊之处在于:它的默认DataContext并不是它附着的控件(比如你的StackPanel),所以需要通过PlacementTarget属性找到那个控件,再读取附加属性的值。修正后的样式如下:

<Style TargetType="ToolTip" x:Key="ToolTipDefaultStyle">
    <Setter Property="ContentTemplate">
        <Setter.Value>
            <DataTemplate>
                <StackPanel>
                    <!-- 通过RelativeSource找到Tooltip本身,再绑定到它的PlacementTarget的附加属性 -->
                    <TextBlock Text="{Binding PlacementTarget.(ap:ToolTipAttachedProperty.Texto), 
                                RelativeSource={RelativeSource AncestorType=ToolTip}}" />
                </StackPanel>
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>

简化写法(可选)

如果后续要扩展更多附加属性,可以先把Tooltip的DataContext设置为它的PlacementTarget,这样绑定会更简洁:

<Style TargetType="ToolTip" x:Key="ToolTipDefaultStyle">
    <!-- 将Tooltip的DataContext绑定到它附着的控件 -->
    <Setter Property="DataContext" Value="{Binding PlacementTarget, RelativeSource={RelativeSource Self}}" />
    <Setter Property="ContentTemplate">
        <Setter.Value>
            <DataTemplate>
                <StackPanel>
                    <!-- 直接绑定附加属性即可 -->
                    <TextBlock Text="{Binding (ap:ToolTipAttachedProperty.Texto)}" />
                    <!-- 后续扩展其他属性比如颜色,直接加绑定:
                    <TextBlock Foreground="{Binding (ap:ToolTipAttachedProperty.TextoColor)}" />
                    -->
                </StackPanel>
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>

3. 控件上的使用方式保持不变

你的StackPanel写法没问题,确保命名空间ap正确指向附加属性所在的程序集/命名空间即可:

<StackPanel Name="spTiposIva" Orientation="Vertical" Margin="5,0,0,0"
            ap:ToolTipAttachedProperty.Texto="{Binding TiposIvaTooltip}">
    <StackPanel.ToolTip>
        <ToolTip Style="{StaticResource ToolTipDefaultStyle}" />
    </StackPanel.ToolTip>
</StackPanel>

这样就能实现和Button完全一样的逻辑:通过附加属性把ViewModel的数据传递到Tooltip的样式中,后续扩展其他变量(比如颜色、字体大小等)只需要新增附加属性,再在样式里绑定即可。

内容的提问来源于stack exchange,提问作者Álvaro García

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 14:23:12