繁体   English   中英

绑定到wpf自定义控件依赖项属性以获得工具提示吗?

[英]Bind to wpf custom control dependency property for tooltip?

我有一个用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}} ,但这也带来了绑定问题。 我不知道该如何诊断,因为我的输出窗口也不会吐出任何绑定表达式错误。

对于WPF ToolTip ,您必须了解它不像其他控件一样属于VisualTree。 它仅在有必要创建它时才起作用,也就是鼠标悬停在控件上时。 此时,WPF将创建ToolTip ,但不会将其放置为AlertControl的子元素,这就是RelativeSourceModeTemplatedParentFindAncestor )都不起作用的原因。

但是,有一个节省的宽限期,那就是ToolTip.PlacementTarget属性。

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

您在这里所做的是告诉WPF BindingExtension绑定到名为PlacementTarget的属性(恰好是根据情况创建了ToolTipAlertControlUIElement ),并且您打算从ToolTip本身定位该属性(不是ToolTipDataContext )。 除此之外,您还计划使用IValueConverter 此外,完整的未解析的PropertyInfo不仅会在ToolTip上查找PlacementTarget ,还会检查从PlacementTarget返回的对象是否可以转换为AlertControl类型,然后访问其IsAlert CLR属性。 我可以很容易地完成Path=PlacementTarget.IsAlert并且通过反射它可以很好地解决问题,但是我更想明确指出应该从AlertControl类型访问IsAlert属性。

您是否还在变量中添加了变量?

喜欢:

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

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

编写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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM