我遇到了一种情况,我可以通过使用MultiDataTrigger
轻松实现相同的功能,或者使用DataTrigger
和MultiBinding
。是否有任何实质性理由偏好一种方法而不是另一种方法?
使用MultiDataTrigger:
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding Path=SomePath}" Value="SomeValue"/>
<Condition Binding="{Binding Path=SomeOtherPath, Converter={StaticResource SomeConverter}}" Value="SomeOtherValue"/>
</MultiDataTrigger.Conditions>
<MultiDataTrigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource MyStoryboard}"/>
</MultiDataTrigger.EnterActions>
</MultiDataTrigger>
使用MultiBinding:
<DataTrigger Value="foo">
<DataTrigger.Binding>
<MultiBinding Converter="{StaticResource fooConv}"/>
<Binding Path=SomePath/>
<Binding Path=SomeOtherPath/>
</MultiBinding>
</DataTrigger.Binding>
<DataTrigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource MyStoryboard}"/>
</DataTrigger.EnterActions>
</DataTrigger>
Multibinding
需要一个转换器,除了最罕见的情况(使用StringFormat
)。
MultiTrigger
只需要一个转换器就可以将你的绑定结果变成boolean
s。
这是一个老问题,但我想详细说明一下。
对我来说,MultiBinding
和MultiDataTrigger
根本不同,虽然在某些情况下你可以同时使用它们来实现相同的功能,但感觉有点像黑客一样使两者都以同样的方式工作。
当您需要单独满足多个条件时,应使用MultiDataTrigger
s,以便您可以执行操作(设置属性值,开始动画等)。例如,你需要A
为true而B
为false。这两种情况本身可以单独解释。就是这个问题的情况。
另一方面,当您需要多个参数来计算您选择的单个输出时,应使用MultiBinding
s。此输出需要具有一些值来设置属性。例如,如果A
等于B
,则只会更改属性值。当您在多个控件上使用相同的样式时,这是有意义的,A是控件的属性(例如,TextBlock的Text属性),B是来自视图模型的名为“SelectedText”的单个属性。所以我们可能要解决的问题是:在我的View中的所有TextBlocks中,将具有与View Model中的属性SelectedText相同的Text的前景设置为闪烁(变色动画)。
在您的示例中,我将使用MultiDataTrigger
,因为您的条件可以单独评估。否则你的MultiValueConverter只会检查你的第二个条件,忽略第一个条件,并且真的没有真正成为MultiDataTrigger的目的。
我将离开XAML作为我将DataTrigger
与上面提到的MultiBinding
一起使用的示例:(我假设您使用的是MVVM模式)
<Style TargetType="{x:Type TextBlock}" x:Key="SelectedTextStyle">
<Setter Property="FontFamily" Value="Segoe UI Light"/>
<Setter Property="FontSize" Value="24"/>
<Setter Property="HorizontalAlignment" Value="Left"/>
<Style.Triggers>
<DataTrigger Value="True">
<DataTrigger.Binding>
<MultiBinding Converter="{StaticResource StringsToBooleanConverter}">
<Binding Path="SelectedText"/> <!--This is a property of the View Model-->
<Binding RelativeSource="{RelativeSource Self}" Path="Text"/> <!--This is the Dependency Property 'Text' of the TextBlock control-->
</MultiBinding>
</DataTrigger.Binding>
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<ColorAnimation Storyboard.TargetProperty="Foreground.Color" Duration="0:0:2" From="Black" To="DarkOrange" AutoReverse="True" FillBehavior="HoldEnd" RepeatBehavior="Forever"/>
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
<DataTrigger.ExitActions>
<BeginStoryboard>
<Storyboard>
<ColorAnimation Storyboard.TargetProperty="Foreground.Color" Duration="0:0:0" From="DarkOrange" To="Black" FillBehavior="HoldEnd"/>
</Storyboard>
</BeginStoryboard>
</DataTrigger.ExitActions>
</DataTrigger>
</Style.Triggers>
</Style>