注意我已经问过相关问题(有一个接受的答案):如何组合DataTrigger和Trigger?
我想我需要结合一个EventTrigger和一个DataTrigger来实现我所追求的目标:
目前我有一个如下所示的DataTemplate:
<DataTemplate DataType="{x:Type Notifications:NotificationViewModel}">
<Grid HorizontalAlignment="Stretch">
<Border Name="Background" CornerRadius="8" Background="#80c0c0c0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
<Border Name="Highlight" CornerRadius="8" Background="Red" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
<!-- snip actual visual stuff -->
<Grid.Triggers>
<EventTrigger RoutedEvent="Grid.Loaded">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation x:Name="LoadedAnimation"
Storyboard.TargetName="Highlight"
Storyboard.TargetProperty="Opacity"
From="0" To="1"
RepeatBehavior="5x"
Duration="0:00:0.2"
AutoReverse="True" />
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</Grid.Triggers>
</Grid>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=IsCritical}" Value="True">
<Setter TargetName="LoadedAnimation" Property="RepeatBehavior" Value="5.5x" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
我们的想法是,在Highlight第一次加载项目时,EventTrigger会将边框的不透明度设置为0到1之间的动画,然后重复返回,从而吸引用户注意它.在DataTrigger确定的时间以动画的数目.如果视图模型报告该项目,IsCritical则动画发生5.5次(使其以不透明度1结束),否则发生5次(以不透明度0结束)
但是上面的XAML不起作用,因为DataTrigger的setter失败了:
在VisualTree中找不到名称为"LoadedAnimation"的子项. …
在我的 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 的猜测当前位于。