36

我遇到了一种情况,我可以通过使用 aMultiDataTrigger或使用 aDataTrigger和 a轻松实现相同的功能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>

使用多重绑定:

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

2 回答 2

16

MultibindingStringFormat除了最罕见的情况(使用)外,其他所有情况都需要转换器。

MultiTrigger只需要一个转换器即可将您的绑定结果转换为booleans.

于 2014-01-08T10:49:00.077 回答
5

我想详细说明一下。

对我来说,MultiBinding两者根本不同,虽然在某些情况下你可以使用两者来实现相同的功能,但让两者以相同MultiDataTrigger的方式工作感觉有点像黑客。

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

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

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

我将把 XAML 用于我上面提到的使用DataTriggerwith的示例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>
于 2019-03-13T15:37:03.347 回答