70 votes

WPF Combobox DisplayMemberPath

Ok, j'ai regardé d'autres questions et ne semble pas pour obtenir ma réponse, alors j'espère que quelqu'un ici peut.

Question très simple pourquoi le DisplayMemberPath propriété de ne pas se lier à l'élément?

<ComboBox Grid.Row="1" Grid.Column="2" ItemsSource="{Binding PromptList}" DisplayMemberPath="{Binding Name}" SelectedItem="{Binding Prompt}"/>

La sortie de trace montre que c'est en essayant de se lier à la classe de la tenue de l'interface IEnumerable pas l'élément réel dans l'interface IEnumerable. Je suis confus comme un simple moyen de remplir une zone de liste modifiable sans l'ajout d'un tas de lignes dans le code xaml.

Il appelle simplement le ToString() de l'objet dans la itemssource. J'ai un travail autour de ce qui est ceci:

<ComboBox Grid.Row="1" Grid.Column="2" ItemsSource="{Binding PromptList}"  SelectedItem="{Binding Prompt}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Name}"/>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

Mais à mon avis c'est beaucoup trop pour une simple tâche. Puis-je utiliser un relativesource de liaison?

163voto

Ben M Points 14458

DisplayMemberPath spécifie le chemin d'accès à la propriété de chaîne d'affichage pour chaque élément. Dans votre cas, vous le définiriez à "Name" , pas "{Binding Name}" .

10voto

Muad'Dib Points 14260

Vous ne vous liez pas aux données de la classe, vous lui indiquez d’obtenir ses données du membre de la classe nommé par le membre "nom", donc si votre instance a item.Name == "steve" elle essaie d’obtenir les données de item.steve .

Pour que cela fonctionne, vous devez supprimer la liaison de MemberPath. Remplacez-le par MemberPath = "Name" cela lui indique d’obtenir les données du membre "Nom". De cette façon, il appellera item.Name , pas item.steve .

7voto

Emu Points 31

Vous devriez changer les MemberPath="{Binding Name}" en MemberPath="Name" . Alors ça va marcher.

5voto

Blam Points 17325

Vous pouvez supprimer DisplayMemberPath, puis définir le chemin d'accès dans le TextBlock.
Le DisplayMemberPath est vraiment pour quand vous n'avez pas ItemTemplate.
Ou vous pouvez supprimer votre ItemTemplate et utiliser DisplayMemberPath - auquel cas, il crée essentiellement un TextBlock pour vous. Non recommandé vous faites les deux.

    <TextBlock text="{Binding Path=Name, Mode=OneWay}" 
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X