web-dev-qa-db-fra.com

MultiDataTrigger vs DataTrigger avec multibinding

J'ai rencontré une situation où je peux facilement obtenir les mêmes fonctionnalités en utilisant un MultiDataTrigger ou, alternativement, en utilisant un DataTrigger avec un MultiBinding. Y a-t-il des raisons substantielles de préférer une approche à l'autre?

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

Avec 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 nécessite un convertisseur pour toutes les circonstances sauf les plus rares (en utilisant StringFormat).

MultiTrigger nécessite uniquement un convertisseur pour obtenir vos résultats de liaison dans booleans.

13
Gusdor

C'est une vieille question, mais je voudrais en dire un peu plus.

Pour moi, MultiBinding et MultiDataTrigger sont fondamentalement différents et bien que dans certaines situations, vous puissiez utiliser les deux pour obtenir la même fonctionnalité, cela ressemble à un hack pour faire fonctionner les deux même façon.

MultiDataTriggers doit être utilisé lorsque vous avez besoin de plus d'une condition séparément pour que vous puissiez effectuer une action (définir une valeur de propriété, commencer une animation, etc.). Par exemple, vous avez besoin de A pour être vrai et B pour être faux. Ces deux conditions peuvent être interprétées séparément. C'est le cas de cette question.

MultiBindings, d'autre part, doit être utilisé lorsque vous avez besoin de plusieurs paramètres pour calculer une sortie unique de votre choix. Cette sortie devrait avoir une certaine valeur pour que vous puissiez définir la propriété. Par exemple, vous ne modifierez la valeur de la propriété que si A est égal à B. Cela est logique lorsque vous utilisez le même style sur plusieurs contrôles et A est une propriété du contrôle (par exemple, la propriété Text d'un TextBlock) et B est une propriété unique du modèle de vue nommée "SelectedText". Ainsi, un problème que nous pourrions essayer de résoudre est le suivant: parmi tous les TextBlocks de ma vue, définissez le premier plan de celui avec le même texte que la propriété SelectedText de mon modèle de vue pour qu'il clignote (animation changeant de couleur).

Dans votre exemple, j'utiliserais un MultiDataTrigger puisque vos conditions peuvent être évaluées séparément. Sinon, votre MultiValueConverter ne vérifierait que votre deuxième condition, ignorant la première et ne servirait à rien d'être un Multi DataTrigger vraiment.

Je vais laisser le XAML pour l'exemple où j'utiliserais le DataTrigger avec MultiBinding que j'ai mentionné ci-dessus: (je suppose que vous utilisez le modèle 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