在我的WPF控件中,我有以下两个触发器:
<Trigger
Property="Controls:TreeViewExItem.IsMouseOver"
Value="True"
SourceName="ElementGrid">
和
<DataTrigger
Binding="{Binding
RelativeSource={RelativeSource AncestorType={x:Type Controls:TreeViewEx}},
Path=HoverHighlighting}"
Value="False">
两者对自己都很好。但我需要这些的组合。我试过这个:
<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'(Name =''); target属性是'NoTarget'(类型 'Object')InvalidCastException:'System.InvalidCastException:Das Objekt des Typs“System.String”kann nicht in Typ “System.Windows.DependencyObject”umgewandelt werden。
那不告诉我什么。它将如何运作?
更新:现在,我的GitHub存储库中提供了完整的项目代码供审核。我对MultiDataTrigger的猜测目前位于at。
答案 0 :(得分:1)
我现在尝试了很多东西,发现没有任何效果。直到有人证明我错了,我必须假设Triggers和DataTriggers不能合并。
我的解决方案是另一个:不是尝试从同一个触发器(需要不同的触发器类型)访问本地属性和父元素属性,而是将另一个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>
一旦它起作用,依赖属性和数据绑定就很棒。但在那之前,它可能会很糟糕。
答案 1 :(得分:0)
我知道这是一个较旧的项目,但我想添加一些我今天发现的东西:即使你不能组合Triggers和Datatriggers,你也可以轻松地将Trigger升级为引用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>
这将使您能够将包含触发器的控件的条件与其他控件的条件相结合,而不需要依赖属性。