8
votes

WPF Combobox - montrant quelque chose de différent lors de la sélection d'une valeur

Ce que je dois accomplir est une combinaison qui montre aux gens. Lorsque vous développez la liste déroulante, il affiche le prénom et le nom de famille, mais lorsque vous sélectionnez une personne, la valeur indiquée sur ComboBox devrait être juste le prénom de la personne.

J'ai l'élément de mesure suivant: P>

<ComboBox.ItemTemplate>
    <DataTemplate>
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="{Binding FirstName}" />
            <TextBlock Text=" " />
            <TextBlock Text="{Binding LastName}" />
        </StackPanel>
    </DataTemplate>
</ComboBox.ItemTemplate>


1 commentaires

Un peu tard, mais relatif à mon avis. Une solution complète différente que celle mentionnée ci-dessous est décrite ici: social.msdn.microsoft.com/forums/en-us/wpf/thread/... . Sans code personnalisé, fonctionne bien aussi.


5 Réponses :


6
votes

Je l'ai eu. Je dois juste ajouter ce qui suit à mon comboBox:

IsEditable="True" IsReadOnly="True" TextSearch.TextPath="FirstName"


3 commentaires

Cela résout ma question initiale mais je l'ai changé un peu. Comment puis-je afficher uniquement l'image par opposition au prénom quand un élément est sélectionné?


Merci d'avoir besoin d'une solution simple pour cela.


Aimez-le, exactement ce que je cherchais!



5
votes

Mettez une gâchette sur le type de données. La gâchette doit vérifier la propriété issuite (le dataTemplate nécessitera un ensemble cibletype pour que cela fonctionne). Si elle est sélectionnée, vous pouvez définir la visibilité de vos blocs de texte à effondrer et définir la visibilité de l'image sur Visible. Ensuite, faites le contraire pour le cas qu'il n'est pas sélectionné.


1 commentaires

Merci. Cela a du sens, car dans une combinaison, un seul élément est sélectionné. Bonne idée.



18
votes

Voici la solution:

    <ComboBox>
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <ContentControl x:Name="content" Content="{Binding}" ContentTemplate="{StaticResource ComplexTemplate}"/>
                </StackPanel>
                <DataTemplate.Triggers>
                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ComboBoxItem}}" Value="{x:Null}">
                        <Setter TargetName="content" Property="ContentTemplate" Value="{StaticResource SimpleTemplate}"/>
                    </DataTrigger>
                </DataTemplate.Triggers>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>


2 commentaires

Merci pour cette impressionnante solution


Seul problème est qu'il provoque des erreurs de liaison WPF pour ne jamais trouver l'ancêtre.



2
votes

Une autre option consiste à utiliser ItemTemplateselector code> au lieu de Itemtemplate code> . Je l'utilise de la manière suivante.

ComboBoxItemTemplateselector code> dérive de DataMplateselector code> et a deux propriétés connectées, sélectionnéTemplate code> et Dropdowntemplate code>. Ensuite, nous définissons les dataMplates de XAML comme celui-ci P>

public static class DependencyObjectExtensions
{
    public static T GetVisualParent<T>(this DependencyObject child) where T : Visual
    {
        while ((child != null) && !(child is T))
        {
            child = VisualTreeHelper.GetParent(child);
        }
        return child as T;
    }
}


0 commentaires

0
votes

J'ai utilisé l'approche suivante xxx

et le comportement xxx

a travaillé comme un charme. N'aimez pas un événement à peu près chargé ici, mais vous pouvez le réparer si vous voulez


0 commentaires