web-dev-qa-db-fra.com

WPF Combobox DisplayMemberPath

Ok, j'ai regardé d'autres questions et je n'ai pas semblé avoir de réponse, alors j'espère que quelqu'un ici le pourra.

Question très simple pourquoi la propriété DisplayMemberPath ne se lie-t-elle pas à l'élément?

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

La sortie de trace montre qu'il essaie de se lier à la classe contenant l'IEnumerable et non l'élément réel dans l'IEnumerable. Je suis confus quant à un moyen simple de remplir une zone de liste déroulante sans ajouter un tas de lignes dans xaml.

Il appelle simplement ToString () pour l'objet dans itemssource. J'ai un travail autour qui est le suivant:

<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 trop pour une tâche aussi simple. Puis-je utiliser une liaison parentsource?

56
Jose

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

133
Ben M

Vous n'êtes pas lié aux données de la classe, vous lui demandez d'obtenir ses données du membre de classe nommé par le membre "nom", donc si votre instance a item.Name == "steve" il essaie d'obtenir les données de item.steve.

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

8
Muad'Dib

Vous pouvez supprimer DisplayMemberPath, puis définir le chemin d'accès dans le TextBlock.
Le DisplayMemberPath est vraiment pour quand vous n'avez aucun ItemTemplate.
Ou vous pouvez supprimer votre ItemTemplate et utiliser DisplayMemberPath - dans ce cas, il crée essentiellement un TextBlock pour vous. Je vous déconseille de faire les deux.

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

Vous devez modifier le MemberPath="{Binding Name}" à MemberPath="Name". Ensuite, cela fonctionnera.

5
Emu

Sinon, vous n'avez pas besoin de définir le DisplayMemberPath. vous pouvez simplement inclure une substitution ToString () dans votre objet qui se trouve dans votre PromptList. comme ça:

class Prompt {
    public string Name = "";
    public string Value = "";

    public override string ToString() {
        return Name;
    }
}

ToString () sera automatiquement appelé et affichera le paramètre Name de votre classe. cela fonctionne pour ComboBoxes, ListBoxes, etc.

2
JJ_Coder4Hire