2008-09-18 11 views
28

je le XAML suivant:WPF DataTrigger pas de tir au moment prévu

<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 heureux avec SelectedItems.Count, montrant 0,1,2, etc. DataTrigger sur le deuxième bloc ne semble jamais tirer pour changer le texte.

Des pensées?

+1

Vous savez, je ne sais pas pourquoi cela continue d'avoir des downvotes - c'est une question légitime. Si vous downvote, laissez au moins un commentaire pourquoi. –

+1

C'est bizarre, envoyer un upvote à votre façon – viggity

+0

Il pourrait être le titre vague, mais c'est un problème commun avec DataTriggers et c'est un bon exemple, +1 –

Répondre

13

Le DataTrigger se déclenche mais le champ Texte de votre deuxième TextBlock est codé en dur en tant que "éléments sélectionnés", il ne peut donc pas être modifié. Pour le voir, 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 l'obtenir pour définir le texte à ce que vous voulez.

Créer ce ValueConverter:

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 
} 

Ajouter la référence d'espace de noms à votre l'ensemble du convertisseur est situé:

xmlns:local="clr-namespace:ValueConverterExample" 

Ajouter le convertisseur à vos ressources:

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

Modifier votre deuxième TextBlock:

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

Vous avez raison, en supprimant le texte travaillé. Je vais juste aller avec le (s) article (s) sélectionné (s) pour le texte puisque je n'ai pas envie de créer un convertisseur entier pour cela. Cependant, je marque ceci comme une réponse acceptée parce que cela fonctionnerait. –

+1

Que se passe-t-il si vous avez besoin du Datatrigger pour contrôler un storyboard? Un convertisseur n'est pas approprié dans ce scénario. Aucun conseil? – Gusdor

28

Sinon, vous pouvez remplacer votre XAML avec 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> 

Convertisseurs peut résoudre beaucoup de problèmes contraignant mais ayant beaucoup de convertisseurs spécialisés devient très salissant.

+0

Merci, votre réponse a résolu mon problème! –

+0

Merci, une solution simple à une restriction très stupide/défaut de conception/Micro $ oft l'irritation imposée. – Xtr