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

我有一个我在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代码:

    ...           

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

说到WPF ToolTip ,你必须明白它不是VisualTree的一部分,就像其他控件一样。 只有当你的鼠标hover在控件上时,它才会发挥作用。 此时,WPF将创建ToolTip ,但它不会将其作为AlertControl的子元素AlertControl ,这就是为什么RelativeSourceModeTemplatedParentFindAncestor )都不起作用的原因。

但是有一个保存优雅,那就是ToolTip.PlacementTarget属性。

  ...  

你在这里做的是告诉WPF BindingExtension绑定到名为PlacementTarget的属性(恰好是创建ToolTipUIElement ,在你的情况下是AlertControl ),并且你正在声明从ToolTip本身找到这个属性(不是ToolTipDataContext )。 除此之外,您还计划使用IValueConverter 。 此外,完全未解析的PropertyInfo不仅在ToolTip上查找PlacementTarget ,还检查从PlacementTarget返回的对象是否可以作为一种AlertControl ,然后访问其IsAlert CLR属性。 我可以很容易地完成Path=PlacementTarget.IsAlert并且通过reflection,它可以很好地解决,但我更喜欢明确声明应该从一种AlertControl访问IsAlert属性。

您是否还将变量添加到代码隐藏中?

喜欢:

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

使用它应该允许您绑定它而不需要任何分层信息。 顺便说一句,您可以通过在转换器中设置断点来轻松检查绑定是否正常。

编写CustomControl与创建基本UserControl 。 首先,您没有自己的XAML文件来定义控件…您必须共享generic.xaml文件。 在数据绑定或事件处理方面,这通常会导致新的开发人员出现问题。 但是,解决方案很简单。

您需要做的就是使用RelativeSource Binding ,而不是TemplatedParent ,而是使用您的控件的属性。 试试这个: