如何将Trigger与SourceName和DataTrigger结合起来?

时间:2012-07-27 10:59:37

标签: wpf xaml triggers multidatatrigger

在我的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

2 个答案:

答案 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>

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