[英]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
的子元素,这就是RelativeSourceMode
( TemplatedParent
和FindAncestor
)都不起作用的原因。
但是,有一个节省的宽限期,那就是ToolTip.PlacementTarget
属性。
<ToolTip Visibility="{Binding Path=PlacementTarget.(local:AlertControl.IsAlert),
RelativeSource={RelativeSource Self},
Converter={...}}">
...
<ToolTip>
您在这里所做的是告诉WPF BindingExtension
绑定到名为PlacementTarget
的属性(恰好是根据情况创建了ToolTip
, AlertControl
的UIElement
),并且您打算从ToolTip
本身定位该属性(不是ToolTip
的DataContext
)。 除此之外,您还计划使用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.