绑定到工具提示的 wpf 自定义控件依赖属性?

2023-11-30

我有一个在 WPF 中编写的自定义控件,它具有布尔依赖属性:

public static readonly DependencyProperty IsAlertProperty
    = DependencyProperty.Register("IsAlert", typeof(bool), typeof(AlertControl),
        new FrameworkPropertyMetadata(default(bool),
            FrameworkPropertyMetadataOptions.None,
            OnIsAlertChanged,
            null,
            false,
            UpdateSourceTrigger.PropertyChanged));

public bool IsAlert
{
    get { return (bool)GetValue(IsAlertProperty); }
    set { SetValue(IsAlertProperty, value); }
}

在我的 Generic.xaml 中,我有以下 xaml 代码:

<Style TargetType="{x:Type local:AlertControl}">
    <Setter Property="Template">
        <Setter.Value> ... </Setter.Value>
    </Setter>

    <Setter Property="ToolTip">
        <Setter.Value>
            <ToolTip Visiblity="{Binding Path=IsAlert,
                             RelativeSource={RelativeSource TemplatedParent},
                             Converter={StaticResource BooleanToVisiblityConverter}">
                <!-- Tooltip content goes here -->
            </ToolTip>
        </Setter.Value>
    </Setter>
<Style />

问题是这似乎不起作用。我使用 Snoop 来监视我的 xaml,并且IsAlert财产正在适当改变,但如果我深入研究我的AlertControl.ToolTip,我看到VisiblityDependencyProperty 存在绑定错误。我也尝试过使用RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:AlertControl}},但这也带来了一个具有约束力的问题。我不知道如何诊断这个问题,因为我的输出窗口也没有吐出任何绑定表达式错误。


当谈到 WPF 时ToolTip,您必须了解它与其他控件不同,不是 VisualTree 的一部分。它仅在需要创建它时才发挥作用,即当您的鼠标悬停在控件上时。此时,WPF将创建ToolTip,但它不会将其作为子元素AlertControl,这就是为什么两者RelativeSourceModes (TemplatedParent and FindAncestor) 不工作。

不过,有一个可取之处,那就是ToolTip.PlacementTarget财产。

<ToolTip Visibility="{Binding Path=PlacementTarget.(local:AlertControl.IsAlert),
                              RelativeSource={RelativeSource Self},
                              Converter={...}}">
    ...
<ToolTip>

您在这里所做的就是告诉 WPFBindingExtension绑定到名为的属性PlacementTarget(这恰好是UIElement创造了ToolTip, the AlertControl在您的情况下),并且您声明从ToolTip本身(不是DataContext of the ToolTip)。除此之外,您还计划使用IValueConverter。此外,完整的未解析的PropertyInfo不仅寻找PlacementTarget on the ToolTip,还检查对象是否从返回PlacementTarget可以被转换为一种类型AlertControl,然后访问其IsAlertCLR 属性。我本来可以轻松做到的Path=PlacementTarget.IsAlert并且,通过反射,它会很好地工作,但我更喜欢明确声明 IsAlert 属性应该从某种类型访问AlertControl.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

绑定到工具提示的 wpf 自定义控件依赖属性? 的相关文章

  • 使用来自本地对象的消息的 std::Exception

    以下代码是否可以安全地抛出带有自定义消息的异常 include
  • C# 中的 Culture 相当于 Java 中的 Locale 吗?

    C 使用文化的概念 这在操作上与 Java 中的 Locale 类似吗 或者底层概念是否存在显着差异 从文化而不是语言环境的角度进行工作是一种寻找正确抽象层次的尝试 从以类似方式做事的人群的角度来考虑事物 而不是谈论地理区域和语言 并有点疯
  • 在 WPF 中的不同控件上显示验证错误模板

    我有一个UserControl包含其他控件和TextBox 它有一个Value绑定到的属性TextBox文本并有ValidatesOnDataErrors设置为 True 当验证错误发生时Value属性绑定 错误模板 标准红色边框 显示在整
  • 函数原型和数组参数

    我正在学习 C 语法 并且已经开始研究数组了 我想问你一个问题 但首先让我回顾一下 这样我就知道我已经弄清楚了 我知道您可以使用以下语法将变量定义为数组 name
  • 将内核链接到 PTX 函数

    我可以使用 PTX 文件中包含的 PTX 函数作为外部设备函数 将其链接到另一个应调用该函数的 cu 文件吗 这是另一个问题CUDA 将内核链接在一起 https stackoverflow com questions 20636800 c
  • CMake - 未定义参考

    我正在尝试将 gtest 包含到我的项目中 问题是我在 GTest 中收到未定义的引用错误 我正在尝试在 Gtest 中测试 Node 类 在节点的构造函数中 我使用类记录器 尽管我已将库记录器添加到 gtest target 中 但我仍然
  • .NET 中 IEqualityComparer 中 GetHashCode 的作用是什么?

    我试图了解 IEqualityComparer 接口的 GetHashCode 方法的作用 下面的例子取自MSDN using System using System Collections Generic class Example st
  • 使用 MapViewOfFile 有什么限制吗?

    我正在尝试将内存映射文件用作 hFile CreateFile State Path GENERIC READ FILE SHARE READ FILE SHARE WRITE 0 OPEN EXISTING FILE FLAG SEQUE
  • 在标准库中静态链接时如何支持动态插件?

    假设一个应用程序myapp exe是使用构建的g 它使用标志 static libstdc 这样就可以安装在没有环境的情况下libstdc so myapp exe还添加了对某些功能的插件支持plugf可以通过动态加载dlopen来自共享库
  • 使用 for 循环创建链表

    这是我的结构 struct ListItem int data struct ListItem next 假设链表的第一个节点的 data 0 我想编写一个 for 循环来创建大小为 5 的链表 但我不知道如何工作 我尝试了以下方法 int
  • 如何忽略搜索条件中的空属性

    我有一个不好的要求要做 无论如何 我必须在我的应用程序中实现它 我有一个Track class public class Track public string Name get set public string City get set
  • 带有 Unicode 字符的主机名在 Windows 8 中有效

    Uri CheckHostName 回报UriHostNameType Unknown到处都是 但在 Windows 8 上 它又回来了UriHostNameType Dns 为什么突然间带有 Unicode 西里尔字符的主机名在 Wind
  • C# 编译器编译 .txt .obj .java 文件

    using System class Program public static void Main Console WriteLine Hello World Console ReadLine 我将文件另存为1 java 2 obj an
  • C# 记录类型:记录子类之间的相等比较

    给定父记录类型 public record Foo string Value 和两个记录子类Bar and Bee我想知道是否可以实施Equals在基类中 因此 Foo Bar 或 Bee 的实例都被考虑equal基于Value 两者都与E
  • RabbitMQ + Windows + LDAP 无需发送密码

    我正在尝试在 Windows 7 上使用 RabbitMQ 3 6 2 进行 LDAP 身份验证 授权 我已经在应用程序发送用户名 密码的情况下进行了基本身份验证 但密码位于我需要弄清楚如何进行的代码中避免 有没有人在不提供密码的情况下成功
  • Azure Function App Azure 服务总线触发器触发两次

    我使用带有服务总线触发器的 Azure Function Apps 来读取服务总线并对服务总线消息的内容执行操作 服务总线接收 JSON 序列化对象 然后将 JSON 消息反序列化回 Function App 中的对象 然而 由于某种原因
  • 如何通过Task.ContinueWith创建传递?

    我想在原始任务结束时添加一个任务 但想保留原始结果和类型 附加任务仅用于记录目的 例如写入控制台等 例如 Task Run gt DateTime Now Hour gt 12 Hey throw new Exception Continu
  • 字符串常量之前应有非限定 ID

    我目前正在编写一个 C 应用程序 它与 math h 结合实现了振荡器 我拥有的代码应该可以很好地用于该应用程序 尝试编译目标文件 但是我遇到编译器错误 很可能与语法 等有关 我认为这与命名空间有关 错误 终端输出 User Name Ma
  • 为什么 32 位 .NET 进程的引用类型的最小大小为 12 字节

    我正在读专业 Net 性能 https rads stackoverflow com amzn click com 1430244585本书有关参考类型内部结构的部分 它提到 对于 32 位 net 进程 引用类型具有 4 字节的对象头和
  • 如何使用字符串的值将字符串转换为 wstring?

    我是 C 新手 我有这个问题 我有一个名为 DATA DIR 的字符串 需要将其格式化为 wstring string str DATA DIR std wstring temp L s str Visual Studio 告诉我没有与参数

随机推荐