MultiDataTrigger与具有多重绑定的DataTrigger

mcw*_*yrm 29 wpf datatrigger multitrigger multibinding

我遇到了一个情况,我可以用它来轻松实现相同的功能MultiDataTrigger,或者交替,使用DataTriggerMultiBinding.是否有任何实质性理由偏好一种方法而不是另一种方法?

使用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>
Run Code Online (Sandbox Code Playgroud)

使用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>
Run Code Online (Sandbox Code Playgroud)

Gus*_*dor 14

Multibinding除了最罕见的情况(使用StringFormat)之外,所有人都需要转换器.

MultiTrigger只需要一个转换器就可以将你的绑定结果变成booleans.

  • 只有努力.我发现这是一个强大的动力:D (7认同)

Dan*_*ues 5

我想再详细说明一点。

对我来说,MultiBindingMultiDataTrigger是根本不同的,虽然在某些情况下,你可以同时使用来实现相同的功能,那感觉有点像一个黑客,使双方的工作相同的方式。

MultiDataTrigger当您需要单独满足多个条件以便执行操作(设置属性值、开始动画等)时,应使用 s 。例如,您需要A为真,也需要为B假。这两个条件本身都可以单独解释。这个问题就是这种情况。

MultiBinding另一方面,当您需要多个参数来计算您选择的单个输出时,应该使用 s。此输出需要具有一定的价值才能设置该属性。例如,您将仅在Aequals 时更改属性值B。当您在多个控件上使用相同的样式并且 A 是控件的一个属性(例如 TextBlock 的 Text 属性)而 B 是视图模型中名为“SelectedText”的单个属性时,这是有意义的。所以我们可能要解决的一个问题是:在我的视图上的所有 TextBlocks 中,将与我的视图模型中的 SelectedText 属性具有相同文本的文本块的前景设置为闪烁(颜色变化动画)。

在您的示例中,我将使用 aMultiDataTrigger因为您的条件可以单独评估。否则,您的 MultiValueConverter 只会检查您的第二个条件,而忽略第一个条件,并且不会真正用作Multi DataTrigger。

我将离开XAML的例子我用DataTriggerMultiBinding,我上面提到的:(我假设你使用的是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>
Run Code Online (Sandbox Code Playgroud)