4

在我的 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”值(类型“布尔”)。绑定表达式:路径=(0);DataItem='String' (HashCode=1047858601); 目标元素是'TreeViewExItem'(名称='');目标属性是'NoTarget'(类型'Object') InvalidCastException:'System.InvalidCastException:在 Typ“System.Windows.DependencyObject”umgewandelt werden 中的 Das Objekt des Typs“System.String”kann nicht。

这并不能告诉我任何事情。它将如何运作?

更新:完整的项目代码现在可以在我的 GitHub 存储库中查看。我对 MultiDataTrigger 的猜测目前位于.

4

2 回答 2

2

我现在尝试了很多东西,但没有发现任何有用的东西。在有人证明我错之前,我必须假设 Triggers 和 DataTriggers 不能结合使用。

我的解决方案是不同的:我没有尝试从同一个触发器(需要不同的触发器类型)访问本地属性和父元素属性,而是将另一个 DependencyProperty 添加到我的子元素类并将其值绑定到父元素的属性。因此子元素不需要找到父元素的值——它总是拥有该值本身的当前副本。由于复制该值是在另一个地方完成的,它使触发器保持美观和小巧。:-)

所以这就是我添加的 XAML 代码的样子。这是子项样式的新设置器:

<!-- 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>

一旦工作,依赖属性和数据绑定就很棒。但在那之前,它可能是可怕的。

于 2012-07-28T13:20:40.167 回答
1

我知道这是一个较旧的项目,但我想添加一些我今天发现的东西:即使你不能组合触发器和数据触发器,你也可以轻松地将触发器升级为引用自我的数据触发器,如下所示:

<MultiDataTrigger.Conditions>
    <Condition Binding="{Binding ElementName=TabsApp, Path=SelectedIndex}" value="0"/>
    <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsEnabled}" Value="False"/>
</MultiDataTrigger.Conditions>

这将使您能够将有关包含触发器的控件的条件与有关其他控件的条件结合起来,不需要依赖属性。

于 2018-02-09T19:20:34.543 回答