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

WPF数据模板:如何及时创建工具提示?,wpf,datatemplate,itemscontrol,tooltip,Wpf,Datatemplate,Itemscontrol,Tooltip,我正在使用DataTemplates呈现ItemsControl中的项。我想显示每个项目的工具提示。如果使用ToolTip=“{binding MyToolTip,Mode=OneWay}”之类的绑定,WPF将在开始时获取一次工具提示,并在打开时不更新工具提示 我的项目实现INotifyPropertyChanged,因此原则上我可以为MyToolTip生成更改通知。问题是,工具提示是基于基础模型中的许多信息生成的。这些信息经常更改,为MyToolTip属性生成更改通知既麻烦又低效。此外,我不希

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


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

您将不得不使用一点代码隐藏,但并没有那么糟糕

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

我假设在调用BindingExpression上的update之前,您会更新工具提示文本?他说生成更改通知会很麻烦,但我猜我仍然假设MyToolTip属性仍然是获取工具提示的正确方法。调用BindingExpression.UpdateTarget()将重新查询该属性的值。此时,我认为您可能还可以将UpdateSourceTrigger=Explicit添加到绑定表达式中,并节省首次填充控件时填充工具提示的开销。UpdateSourceTrigger仅影响更改从目标到源的传播。由于这是一个单向绑定,这些更改无论如何都会被忽略。谢谢,这很有魅力!但是Joe White的提示不起作用——我认为UpdateSourceTrigger=Explicit意味着对WPF控件的更改不会自动传播回数据源。因此,如果Mode=one-way,那么UpdateSourceTrigger=Explicit没有效果。
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();
}