我有一个我在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}}
,但这也给出了一个约束性问题。我不知道如何诊断这个,因为我的输出窗口也没有吐出任何绑定表达式错误。
答案 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>