如何将触发器与 SourceName 和 DataTrigger 结合起来?

ygo*_*goe 5 wpf xaml triggers multidatatrigger

在我的 WPF 控件中,我有以下两个触发器:

<Trigger
  Property="Controls:TreeViewExItem.IsMouseOver"
  Value="True"
  SourceName="ElementGrid">
Run Code Online (Sandbox Code Playgroud)

<DataTrigger
  Binding="{Binding
    RelativeSource={RelativeSource AncestorType={x:Type Controls:TreeViewEx}},
    Path=HoverHighlighting}"
  Value="False">
Run Code Online (Sandbox Code Playgroud)

两者本身都工作得很好。但我需要这些的结合。我试过这个:

<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>
Run Code Online (Sandbox Code Playgroud)

但它什么也没做。我在输出窗口中收到此消息:

System.Windows.Data 错误:17:无法从“”(类型“字符串”)获取“IsMouseOver”值(类型“布尔”)。绑定表达式:路径=(0); DataItem='字符串' (HashCode=1047858601); 目标元素是 'TreeViewExItem' (Name=''); 目标属性为“NoTarget”(类型“Object”) InvalidCastException:“System.InvalidCastException:Das Objekt des Typs“System.String”可以在 Typ“System.Windows.DependencyObject”umgewandelt werden 中使用。

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

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

ygo*_*goe 3

我现在已经尝试了很多东西,但没有发现任何有效的方法。在有人证明我错了之前,我必须假设触发器和数据触发器不能组合。

我的解决方案是不同的:我没有尝试从同一触发器访问本地属性和父元素属性(需要不同的触发器类型),而是向我的子元素类添加了另一个 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}}}" />
Run Code Online (Sandbox Code Playgroud)

这是在触发器部分,所有其他触发器都已经在其中:

<!-- 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>
Run Code Online (Sandbox Code Playgroud)

依赖属性和数据绑定一旦发挥作用就非常有用。但在那之前,情况可能会很可怕。