MultiDataTrigger与具有多重绑定的DataTrigger

时间:2014-01-08 10:44:12

标签: wpf datatrigger multibinding multitrigger

我遇到的情况是,我可以使用MultiDataTrigger轻松实现相同的功能,或者使用带有DataTrigger的{​​{1}}。是否有任何实质性的理由偏好一种方法而不是另一种方法?

使用MultiDataTrigger:

MultiBinding

使用MultiBinding:

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

2 个答案:

答案 0 :(得分:13)

除了最罕见的情况之外,

Multibinding需要转换器(使用StringFormat)。

MultiTrigger只需要转换器即可将绑定结果转换为boolean s。

答案 1 :(得分:0)

这是一个古老的问题,但我想详细说明。

对我来说,MultiBindingMultiDataTrigger根本不同,尽管在某些情况下您可以同时使用两者来实现相同的功能,但是让两者都可以用作一样方式。

当您需要分别满足多个条件时,应使用

MultiDataTrigger s,以便您可以执行操作(设置属性值,开始动画等)。例如,您需要A为真,B为假。这两个条件可以单独解释。这个问题就是这种情况。

另一方面,当您需要多个参数来计算您选择的单个输出时,应使用

MultiBinding s。对于您设置属性,此输出将需要具有一定的价值。例如,仅当A等于B时,才能更改属性值。当您在多个控件上使用相同样式并且A是控件的属性(例如,TextBlock的Text属性)并且B是视图模型中名为“ SelectedText”的单个属性时,这才有意义。因此,我们可能要解决的问题是:在我的视图上的所有TextBlock中,将与我的视图模型中的SelectedText属性相同的Text设置为前景的闪烁(变色动画)。

在您的示例中,我将使用MultiDataTrigger,因为您的条件可以单独评估。否则,您的MultiValueConverter只会检查您的第二个条件,而忽略第一个条件,并且对于真正成为 Multi DataTrigger并没有实际目的。

在上面提到的将DataTriggerMultiBinding结合使用的示例中,我将保留XAML :(我假设您正在使用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>