web-dev-qa-db-fra.com

Pourquoi ne puis-je pas ajouter un DataTrigger à la collection Triggers de mon contrôle?

Pourquoi je ne peux pas coder comme ça

<Border Width="130" Height="70">
    <Border.Triggers>
        <DataTrigger Binding="{Binding Path=CurrentStatus}" Value="0">
            <Setter Property="Style" Value="{StaticResource ResourceKey=ListBoxItemBorder}"/>
        </DataTrigger>
        <DataTrigger Binding="{Binding Path=CurrentStatus}" Value="200">
            <Setter Property="Style" Value="{StaticResource ResourceKey=ListBoxItemBorderInactive}"/>
        </DataTrigger>
    </Border.Triggers>
</Border>

Je reçois cette erreur

Failed object initialization (ISupportInitialize.EndInit). 
Triggers collection members must be of type EventTrigger.  
Error at object '4_T' in markup file

Qu'est-ce que je fais mal aider plz.

15
Tan

Abe a raison et explique bien les limitations. Une chose à considérer est:

Au lieu d'avoir deux styles de bordure et d'essayer de les choisir en fonction d'un déclencheur ...

Utilisez un seul style sur votre bordure. Les modificateurs de ce style représentent votre apparence «normale». Ce style contient également votre DataTrigger et votre DataTrigger possède une collection de paramètres qui représentent essentiellement votre deuxième style (qui ont une priorité plus élevée que les paramètres standard lorsque ce déclencheur est évalué à true!

Modifier:

Quelque chose comme ça -

<Style TargetType="Border" x:Key="BorderStyle">
    <!-- These setters are the same as your normal style when none of your triggers are true -->
    <Setter Property="BorderBrush" Value="Black" />
    <Style.Triggers>
        <DataTrigger Binding="{Binding Path=CurrentStatus}" Value="0">
            <!-- These setters are the same as your ListBoxItemBorder style -->
            <Setter Property="BorderBrush" Value="Green" />
        </DataTrigger>
        <DataTrigger Binding="{Binding Path=CurrentStatus}" Value="200">
            <!-- These setters are the same as your ListBoxItemBorderInactive style -->
            <Setter Property="BorderBrush" Value="Gray" />
        </DataTrigger>
    </Style.Triggers>
</Style>
31
Scott

Malheureusement, seule la variable EventTriggers peut être appliquée directement aux éléments. Si vous souhaitez utiliser Trigger ou DataTrigger, ils doivent figurer dans Style, ControlTemplate ou DataTemplate.

D'après les noms de ressources, il semble qu'il s'agisse d'une Border dans une ListBoxItemControlTemplate. Vous pouvez facilement déplacer les déclencheurs dans la collection de déclencheurs du modèle.

18
Abe Heidebrecht

Voici un moyen de ne pas déclencher de limitations.

Exemple:

 <Border Width="130" Height="100" Grid.Row="1">
        <ListBox x:Name="lstItems" ItemsSource="{Binding TestItems}">

        </ListBox>
        <tg:TriggerExtensions.Triggers>
            <tg:TriggerCollections>
                <tg:DataTriggerInfo Binding="{Binding CurrentStatus}" Value="0">
                    <tg:DataTriggerInfo.Setters>
                        <tg:SetterInfo ElementName="lstItems" Property="Style" Value="{StaticResource ListBoxRed}"/>
                    </tg:DataTriggerInfo.Setters>
                </tg:DataTriggerInfo>
                <tg:DataTriggerInfo Binding="{Binding CurrentStatus}" Value="0" IsInvert="True">
                    <tg:DataTriggerInfo.Setters>
                        <tg:SetterInfo ElementName="lstItems" Property="Style" Value="{StaticResource ListBoxBlue}"/>
                    </tg:DataTriggerInfo.Setters>
                </tg:DataTriggerInfo>
            </tg:TriggerCollections>
        </tg:TriggerExtensions.Triggers>
    </Border>

Link Sample

Composant de liaison Github

0
Ali Yousefie