WPF数据模板:如何实时创建工具提示?

4
我正在使用DataTemplates来渲染ItemsControl中的项目。我想为每个项目显示一个工具提示。如果我使用像ToolTip="{Binding MyToolTip,Mode=OneWay}"这样的绑定,WPF会在开始时获取一次工具提示,并且在打开时不会更新工具提示。
我的项实现了INotifyPropertyChanged,因此原则上我可以为MyToolTip生成更改通知。问题是,工具提示基于底层模型中的许多信息生成。这些信息经常发生变化,为MyToolTip属性生成更改通知既麻烦又低效。此外,我不希望初始时为所有项目生成工具提示。相反,我想在打开工具提示时强制生成新的工具提示。我该怎么做?
1个回答

5

您需要使用一些代码后端,但并不那么糟糕。

<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文本吗? - micahtan
他说生成更改通知会很麻烦,但我还是假设MyToolTip属性仍然是获取工具提示的正确方式。调用BindingExpression.UpdateTarget()将重新查询该属性的值。 - Bryce Kahle
1
在那时,我认为您可能还可以将UpdateSourceTrigger=Explicit添加到绑定表达式中,并在首次填充控件时节省填充ToolTip的开销。 - Joe White
1
UpdateSourceTrigger 只影响从目标到源的更改传播。由于这是单向绑定,这些更改无论如何都会被忽略。 - Bryce Kahle
谢谢,这个方法很棒!Joe White的建议没用 - 我认为UpdateSourceTrigger=Explicit意味着对WPF控件所做的更改不会自动传播回数据源。因此,如果Mode=OneWay,则UpdateSourceTrigger=Explicit无效。 - Qwertie
我很惊讶地发现在我的UserControl的资源中,实际上是可以附加一个DataTemplate内部的事件处理程序的。如果资源在独立共享字典中,那么是否不可能附加事件处理程序呢? - Qwertie

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