如何将触发器与 SourceName 和 DataTrigger 结合使用?

Posted

技术标签:

【中文标题】如何将触发器与 SourceName 和 DataTrigger 结合使用?【英文标题】:How can I combine a Trigger with a SourceName and a DataTrigger? 【发布时间】:2012-07-26 01:14:07 【问题描述】:

在我的 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”(类型 '对象') InvalidCastException:'System.InvalidCastException: Das Objekt des Typs "System.String" kann nicht in Typ "System.Windows.DependencyObject" umgewandelt werden。

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

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

【问题讨论】:

相关问题here. 相关,但没有帮助,因为它不使用任何 SourceName 属性。 【参考方案1】:

我现在已经尝试了很多东西,但没有发现任何有用的东西。除非有人证明我错了,否则我必须假设 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>

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

【讨论】:

【参考方案2】:

我知道这是一个较旧的项目,但我想添加一些我今天发现的东西:即使你不能组合触发器和数据触发器,你也可以轻松地将触发器升级为引用自我的 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 和 DataTrigger 结合使用?的主要内容,如果未能解决你的问题,请参考以下文章

天蓝色函数时间触发器和天蓝色sql数据库与c#之间的连接:错误。如何修复它

常用的一些 linux 指令

常用的一些 linux 指令

如何将DataTable转换成List<T>

如何使用来自 AJAX 帖子的 Rails send_data 触发下载

如何在 select_tag rails 5 中添加数据触发属性