web-dev-qa-db-ja.com

MultiDataTriggerとマルチバインディングのDataTrigger

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>

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

Multibindingは、(StringFormatを使用して)最もまれな状況を除くすべての場合にコンバーターを必要とします。

MultiTriggerには、バインディング結果をbooleansに取得するためのコンバーターのみが必要です。

13
Gusdor

これは古い質問ですが、もう少し詳しく説明したいと思います。

私にとって、MultiBindingMultiDataTriggerは根本的に異なり、場合によっては両方を使用して同じ機能を実現できますが、両方をsame方法。

MultiDataTriggersは、複数の条件を満たしている必要がある場合に使用する必要があります個別にアクション(プロパティ値の設定、アニメーションの開始など)を実行できます。たとえば、Aをtrueにし、Bをfalseにする必要があります。これらの条件はどちらも単独で個別に解釈できます。これはこの質問の場合です。

一方、MultiBindingsは、選択した単一の出力を計算するために複数のパラメーターが必要な場合に使用する必要があります。この出力は、プロパティを設定するために何らかの値である必要があります。たとえば、ABと等しい場合にのみプロパティ値を変更します。これは、複数のコントロールで同じスタイルを使用し、Aがコントロールのプロパティ(TextBlockのTextプロパティなど)で、Bが「SelectedText」という名前のビューモデルの単一プロパティである場合に意味があります。したがって、解決しようとしている問題はこれです:私のビューのすべてのTextBlocksの中で、ビューモデルのSelectedTextプロパティと同じTextを持つものの前景を点滅するように設定します(色が変化するアニメーション)。

あなたの例では、条件を個別に評価できるため、MultiDataTriggerを使用します。そうしないと、MultiValueConverterは2番目の条件のみをチェックし、最初の条件を無視し、実際に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>
1
Daniel Marques