Puis-je utiliser un Modèle différent de l'élément sélectionné dans un WPF ComboBox que pour les éléments dans la liste déroulante de la partie?

J'ai un WPF zone de liste déroulante qui est rempli avec, disons, le Client ne s'y oppose. J'ai un DataTemplate:

<DataTemplate DataType="{x:Type MyAssembly:Customer}">
    <StackPanel>
        <TextBlock Text="{Binding Name}" />
        <TextBlock Text="{Binding Address}" />
    </StackPanel>
</DataTemplate>

De cette façon, quand j'ouvre ma ComboBox, je peux voir les différents Clients avec leur Nom et, en dessous, l'Adresse.

Mais lorsque je sélectionne un Client, je ne veux afficher le Nom dans la zone de liste déroulante. Quelque chose comme:

<DataTemplate DataType="{x:Type MyAssembly:Customer}">
    <StackPanel>
        <TextBlock Text="{Binding Name}" />
    </StackPanel>
</DataTemplate>

Puis-je choisir un autre Modèle pour l'élément sélectionné dans une liste déroulante?

Solution

Avec l'aide de la réponse, je l'ai résolu comme ceci:

<UserControl.Resources>
    <ControlTemplate x:Key="SimpleTemplate">
        <StackPanel>
            <TextBlock Text="{Binding Name}" />
        </StackPanel>
    </ControlTemplate>
    <ControlTemplate x:Key="ExtendedTemplate">
        <StackPanel>
            <TextBlock Text="{Binding Name}" />
            <TextBlock Text="{Binding Address}" />
        </StackPanel>
    </ControlTemplate>
    <DataTemplate x:Key="CustomerTemplate">
        <Control x:Name="theControl" Focusable="False" Template="{StaticResource ExtendedTemplate}" />
        <DataTemplate.Triggers>
            <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ComboBoxItem}}, Path=IsSelected}" Value="{x:Null}">
                <Setter TargetName="theControl" Property="Template" Value="{StaticResource SimpleTemplate}" />
            </DataTrigger>
        </DataTemplate.Triggers>
    </DataTemplate>
</UserControl.Resources>

Alors, mon ComboBox:

<ComboBox ItemsSource="{Binding Customers}" 
                SelectedItem="{Binding SelectedCustomer}"
                ItemTemplate="{StaticResource CustomerTemplate}" />

La partie importante de l'obtenir pour fonctionner est Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ComboBoxItem}}, Path=IsSelected}" Value="{x:Null}" (la partie où la valeur doit être x:Null, True).

  • Votre solution fonctionne, mais j'ai des erreurs dans la fenêtre de Sortie. System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.ComboBoxItem', AncestorLevel='1''. BindingExpression:Path=IsSelected; DataItem=null; target element is 'ContentPresenter' (Name=''); target property is 'NoTarget' (type 'Object')
  • Je me souviens avoir vu ces trop d'erreurs. Mais je ne suis plus sur le projet (ou même dans la société), donc je ne peux pas le vérifier, désolé.
  • La mention du Chemin de Liaison dans le DataTrigger est inutile. Comme le ComboBoxItem est sélectionné, un autre modèle sera appliqué pour le contrôle et la DataTrigger de liaison de ne plus être en mesure de trouver un ancêtre de type ComboBoxItem dans son élément de l'arbre. Ainsi, la comparaison avec la valeur null est toujours réussie. Cette méthode fonctionne parce que le Visuel de l'arbre de la ComboBoxItem est différent selon qu'il est sélectionné ou de l'afficher dans la fenêtre contextuelle.
InformationsquelleAutor Peter | 2011-01-12