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

时间:2014-06-10 12:44:51

标签: c# wpf xaml custom-controls dependency-properties

我有一个我在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,我会发现Visiblity DependencyProperty有绑定错误。我也尝试使用RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:AlertControl}},但这也给出了一个约束性问题。我不知道如何诊断这个,因为我的输出窗口也没有吐出任何绑定表达式错误。

3 个答案:

答案 0 :(得分:1)

当涉及到WPF ToolTip时,你必须明白它不是VisualTree的一部分,就像其他控件一样。只有当你的鼠标悬停在控件上时,它才会发挥作用。目前,WPF会创建ToolTip,但不会将其作为AlertControl的子元素,这就是RelativeSourceMode s TemplatedParent的原因。并且FindAncestor)没有用。

虽然有一个保存的恩典,那就是ToolTip.PlacementTarget属性。

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

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

答案 1 :(得分:0)

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

像:

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

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

答案 2 :(得分:0)

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

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

<ToolTip Visiblity="{Binding Path=IsAlert, RelativeSource={RelativeSource 
    AncestorType={x:Type YourXamlNamespacePrefix:AlertControl}}, 
    Converter={StaticResource BooleanToVisiblityConverter}">
    <!-- Tooltip content goes here -->
</ToolTip>