Wpf 如何将触发器与SourceName和DataTrigger组合?
在我的WPF控件中,我有以下两个触发器:Wpf 如何将触发器与SourceName和DataTrigger组合?,wpf,xaml,triggers,multidatatrigger,Wpf,Xaml,Triggers,Multidatatrigger,在我的WPF控件中,我有以下两个触发器: <Trigger Property="Controls:TreeViewExItem.IsMouseOver" Value="True" SourceName="ElementGrid"> 及 两者都很好。但我需要这些的组合。我试过这个: <MultiDataTrigger> <MultiDataTrigger.Conditions> <Condition Bindi
<Trigger
Property="Controls:TreeViewExItem.IsMouseOver"
Value="True"
SourceName="ElementGrid">
及
两者都很好。但我需要这些的组合。我试过这个:
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition
Binding="{Binding
RelativeSource={RelativeSource AncestorType={x:Type Controls:TreeViewEx}},
Path=HoverHighlighting}"
Value="True"/>
<Condition
Binding="{Binding
(Controls:TreeViewExItem.IsMouseOver),
Source=ElementGrid}"
Value="True"/>
</MultiDataTrigger.Conditions>
但它什么也没做。我在输出窗口中收到以下消息:
System.Windows.Data错误:17:无法获取“IsMouseOver”值(类型
“Boolean”)从“”(键入“String”)。BindingExpression:路径=(0);
DataItem='String'(HashCode=1047858601);目标元素是
“TreeViewExItem”(名称=“”);目标属性为“NoTarget”(类型
'Object')InvalidCastException:'System.InvalidCastException:Das
类型对象“System.String”在类型中不存在
“System.Windows.DependencyObject”umgewandelt-werden
那没告诉我什么。它将如何工作
更新:完整的项目代码现在可以在我的GitHub存储库中查看。我对MultiDataTrigger的猜测目前已找到。我现在尝试了很多方法,但没有发现任何有效的方法。除非有人证明我错了,否则我必须假设触发器和数据触发器不能组合 我的解决方案与此不同:我没有尝试从同一触发器(需要不同的触发器类型)访问本地属性和父元素属性,而是向子元素类添加了另一个DependencyProperty,并将其值绑定到父元素的属性。因此,子元素不需要找到父元素值——它总是有值本身的当前副本。由于复制该值是在另一个位置完成的,因此它可以使触发器保持良好且小的状态。:-) 这就是我添加的XAML代码的样子。下面是子项样式中的新setter:
<!-- Pass on the TreeViewEx' HoverHighlighting value to each item
because we couldn't access it otherwise in the triggers -->
<Setter
Property="HoverHighlighting"
Value="{Binding (Controls:TreeViewEx.HoverHighlighting),
RelativeSource={RelativeSource
AncestorType={x:Type Controls:TreeViewEx}}}" />
这是在触发器部分中,所有其他触发器都已经:
<!-- Set the border and background when the mouse is located over
the item and HoverHighlighting is active -->
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition
Property="Controls:TreeViewExItem.HoverHighlighting" Value="True"/>
<Condition
Property="Controls:TreeViewExItem.IsMouseOver" Value="True"
SourceName="ElementGrid"/>
</MultiTrigger.Conditions>
依赖性属性和数据绑定一旦起作用就很好了。但在那之前,它可能会很可怕。我知道这是一个较旧的项目,但我想为它添加一些我今天发现的东西:即使你不能组合触发器和Datatriggers,你也可以轻松地将触发器升级为引用Self的DataTrigger,如下所示:
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding ElementName=TabsApp, Path=SelectedIndex}" value="0"/>
<Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsEnabled}" Value="False"/>
</MultiDataTrigger.Conditions>
这将使您能够将关于包含触发器的控件的条件与关于其他控件的条件相结合,不需要依赖项属性。相关问题。相关,但没有帮助,因为它不使用任何SourceName属性。
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding ElementName=TabsApp, Path=SelectedIndex}" value="0"/>
<Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsEnabled}" Value="False"/>
</MultiDataTrigger.Conditions>