Question

J'ai le code XAML suivant:

<TextBlock Text="{Binding ElementName=EditListBox, Path=SelectedItems.Count}" Margin="0,0,5,0"/>
<TextBlock Text="items selected">
    <TextBlock.Style>
        <Style TargetType="{x:Type TextBlock}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=EditListBox, Path=SelectedItems.Count}" Value="1">
                    <Setter Property="TextBlock.Text" Value="item selected"></Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBlock.Style>
</TextBlock>

Le premier bloc de texte change avec bonheur avec SelectedItems.Count, affichant 0,1,2, etc. Le déclencheur de données du deuxième bloc ne semble jamais se déclencher pour modifier le texte.

Avez-vous des idées?

Était-ce utile?

La solution

Le DataTrigger est activé, mais le champ Texte de votre deuxième TextBlock est codé en dur en tant qu'items "éléments sélectionnés". afin qu'il ne puisse pas changer. Pour le voir se déclencher, vous pouvez supprimer Text = "éléments sélectionnés".

Votre problème est un bon candidat pour utiliser un ValueConverter au lieu de DataTrigger . Voici comment créer et utiliser ValueConverter pour qu’il définisse le texte comme vous le souhaitez.

Créer ce convertisseur de valeur:

public class CountToSelectedTextConverter : IValueConverter
{
    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if ((int)value == 1)
            return "item selected";
        else
            return "items selected";
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    #endregion
}

Ajoutez la référence à l'espace de noms à l'assembly dans lequel se trouve le convertisseur:

xmlns:local="clr-namespace:ValueConverterExample"

Ajoutez le convertisseur à vos ressources:

<Window.Resources>
    <local:CountToSelectedTextConverter x:Key="CountToSelectedTextConverter"/>
</Window.Resources>

Modifiez votre deuxième bloc de texte en:

    <TextBlock Text="{Binding ElementName=EditListBox, Path=SelectedItems.Count, Converter={StaticResource CountToSelectedTextConverter}}"/>

Autres conseils

Vous pouvez également remplacer votre code XAML par ceci:

<TextBlock Margin="0,0,5,0" Text="{Binding ElementName=EditListBox, Path=SelectedItems.Count}"/>
<TextBlock>
    <TextBlock.Style>
        <Style TargetType="{x:Type TextBlock}">
            <Setter Property="Text" Value="items selected"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=EditListBox, Path=SelectedItems.Count}" Value="1">
                    <Setter Property="Text" Value="item selected"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBlock.Style>
</TextBlock>

Les convertisseurs peuvent résoudre beaucoup de problèmes de liaison, mais il est très compliqué d’avoir beaucoup de convertisseurs spécialisés.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top