2009-09-23 10 views
3

J'ai une zone de liste déroulante dans laquelle je mis en place un ItemTemplate qui ressemble à ceci sélectionné:Affichage de l'élément différemment dans ComboBox

<ComboBox.ItemTemplate> 
    <DataTemplate> 
    <StackPanel Orientation="Horizontal"> 
     <TextBlock Text="{Binding Piece.NoPiece}" Width="50" /> 
     <TextBlock Text="{Binding Piece.Description}" Width="170" /> 
     <TextBlock Text="{Binding Piece.Categorie.NomCategorie}" /> 
    </StackPanel> 
    </DataTemplate> 
</ComboBox.ItemTemplate> 

Comme vous pouvez le voir, je me suis trois colonnes qui permettent à l'utilisateur de voir différents un bout d'information. Cependant, j'aimerais que l'élément sélectionné dans le combo affiche uniquement la deuxième colonne. En d'autres termes, est-il possible d'avoir un ItemTemplate qui affiche les éléments d'une manière différente lorsque vous faites défiler vers le bas par rapport à quand il est fermé et vous ne voyez que la sélection?

+0

Une chance avec ça? Ma solution a-t-elle fonctionné pour vous? –

+0

Ce n'est pas exactement ce que je cherche. Lorsque je sélectionne un élément, le détail apparaît toujours lorsque la zone de liste déroulante est fermée. Mais il cache les détails quand je rouvre la liste pour trouver une autre réponse. L'idée derrière cela est que je voudrais que l'utilisateur ne voit que la deuxième colonne lorsque la zone de liste déroulante est affichée 'comme une zone de texte', mais quand je l'ouvre, alors je serais en mesure de voir les détails. Si ce n'est pas possible, ça va. C'est une fonctionnalité «agréable à avoir», pas une nécessité. –

+1

J'ai mis à jour ma réponse pour montrer comment faire ce que vous voulez. –

Répondre

7

Vous pouvez le faire avec des déclencheurs:

<ComboBox.ItemTemplate> 
    <DataTemplate> 
    <StackPanel Orientation="Horizontal"> 
     <TextBlock Text="{Binding Piece.NoPiece}" Width="50" x:Name="Column1" /> 
     <TextBlock Text="{Binding Piece.Description}" Width="170" /> 
     <TextBlock Text="{Binding Piece.Categorie.NomCategorie}" x:Name="Column3" /> 
    </StackPanel> 
    <DataTemplate.Triggers> 
     <!-- This trigger fires for the selected item in the drop-down list --> 
     <DataTrigger Binding="{Binding 
         RelativeSource={RelativeSource Mode=FindAncestor, 
                 AncestorType=ComboBoxItem}, 
         Path=IsSelected}" 
     Value="True"> 
     <Setter TargetName="Column1" Property="Visibility" Value="Hidden" /> 
     <Setter TargetName="Column3" Property="Visibility" Value="Hidden" /> 
     </DataTrigger> 

     <!-- This trigger fires for the selected item (ie the one that's 
      visible when the popup is closed --> 
     <DataTrigger Binding="{Binding 
         RelativeSource={RelativeSource Mode=FindAncestor, 
                 AncestorType=ComboBoxItem}}" 
        Value="{x:Null}"> 
     <Setter TargetName="Column1" Property="Visibility" Value="Hidden" /> 
     <Setter TargetName="Column3" Property="Visibility" Value="Hidden" /> 
     </DataTrigger> 
    </DataTemplate.Triggers> 
    </DataTemplate> 
</ComboBox.ItemTemplate> 

EDIT

J'ai mis à jour le XAML pour montrer comment appliquer la mise en forme alternative à l'élément sélectionné lorsque la fenêtre est réduite (I Je ne suis pas sûr de ce que cette zone est appelée.)

L'astuce est que les éléments de la zone de liste déroulante sont contenus dans ComboBoxItem objets dans l'arborescence logique. La liaison RelativeSource recherche un objet de ce type en tant qu'ancien.

  • Si elle le trouve, il suppose que l'article se trouve dans l'arbre (et vérifie si elle est sélectionnée)
  • Si elle est introuvable (null), il prend l'élément se trouve dans la zone de zone de liste déroulante plutôt que la fenêtre

Cela se désagrégerait si vous aviez, d'une façon ou d'une autre, une zone de liste déroulante dans le modèle d'élément d'une autre zone de liste déroulante. Je ne pense pas que je voudrais utiliser cette interface si!

+0

Cependant, ceci génère une exception de liaison: 'Impossible de trouver la source pour la liaison avec la référence 'RelativeSource FindAncestor, AncestorType =' System.Windows.Controls.ComboBoxItem ', AncestorLevel =' 1'''. Je pense que la définition de ItemTemplateSelector est une meilleure approche. Voici un exemple: http://social.msdn.microsoft.com/Forums/vstudio/en-US/0467c9ca-efb2-4506-96e7-08ce3356860a/combobox-one-template-for-selected-item-one-for -la liste déroulante? forum = wpf –