【问题标题】:WPF DataTemplate: How to create a tooltip just-in-time?WPF DataTemplate:如何即时创建工具提示?
【发布时间】:2009-06-08 21:54:47
【问题描述】:

我正在使用 DataTemplates 来呈现 ItemsControl 中的项目。我想为每个项目显示一个工具提示。如果我使用 ToolTip="{Binding MyToolTip,Mode=OneWay}" 之类的绑定,WPF 会在开始时获取一次工具提示,并且在打开时不会更新工具提示。

我的项目实现了 INotifyPropertyChanged,因此原则上我可以为 MyToolTip 生成更改通知。问题是,工具提示是基于底层模型中的许多信息生成的。这些信息经常更改,为 MyToolTip 属性生成更改通知既麻烦又低效。此外,我不希望最初生成所有项目的工具提示。相反,我想在打开工具提示时强制生成一个新的工具提示。我该怎么做?

【问题讨论】:

    标签: wpf datatemplate itemscontrol tooltip


    【解决方案1】:

    您将不得不使用一些代码隐藏,但这还不错。

    <object ToolTip="{Binding MyToolTip, Mode=OneWay}" ToolTipOpening="MyToolTip_Opening" />
    

    在代码隐藏中

    private void MyToolTip_Opening(object sender, ToolTipEventArgs e)
    {
        DependencyObject depObj = sender as DependencyObject;
        if (depObj == null) return;
        BindingExpression be = BindingOperations.GetBindingExpression(depObj, FrameworkElement.ToolTipProperty);
        if (be != null) be.UpdateTarget();
    }
    

    【讨论】:

    • 我假设在您对 BindingExpression 调用 update 之前,您会更新 ToolTip 文本?
    • 他说生成更改通知会很麻烦,但我想我仍然假设 MyToolTip 属性仍然是获取工具提示的正确方法。调用 BindingExpression.UpdateTarget() 将重新查询该属性的值。
    • 那时,我认为您可能还可以将 UpdateSourceTrigger=Explicit 添加到绑定表达式中,并节省首次填充控件时填充 ToolTip 的开销。
    • UpdateSourceTrigger 仅影响从目标到源的更改传播。由于这是一个 OneWay 绑定,因此无论如何都会忽略这些更改。
    • 谢谢,这就像一个魅力! Joe White 的提示不起作用——我认为 UpdateSourceTrigger=Explicit 意味着对 WPF 控件的更改不会自动传播回数据源。因此,如果 Mode=OneWay 则 UpdateSourceTrigger=Explicit 无效。
    猜你喜欢
    • 2021-02-07
    • 1970-01-01
    • 2016-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多