WPF Combobox DisplayMemberPath

Ok, j'ai regardé d'autres questions et n'ai pas semblé obtenir ma réponse, alors j'espère que quelqu'un ici peut le faire.

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'elle essaie de se lier à la classe contenant le IEnumerable pas l'élément réel dans le IEnumerable. Je suis confus quant à un moyen simple de remplir une 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 duquel 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 trop pour une tâche aussi simple. Puis-je utiliser une liaison relativesource?

48
demandé sur Jose 2009-09-22 18:58:26

5 réponses

DisplayMemberPath spécifie le chemin d'accès à la propriété display string pour chaque élément. Dans votre cas, vous le définissez sur "Name", pas sur "{Binding Name}".

125
répondu Ben M 2009-09-22 15:00:38

Vous n'êtes pas lié aux données de la classe, vous lui dites d'obtenir ses données du membre de la classe nommé par le membre "name", 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 du chemin membre. Changez-le en MemberPath = "Name" cela lui indique d'obtenir les données du membre "nom". De cette façon, il appellera item.Name, Pas item.steve.

7
répondu Muad'Dib 2013-04-05 12:03:25

Vous pouvez supprimer DisplayMemberPath, puis définir le chemin dans le bloc 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. Pas recommandé vous faites les deux.

   <TextBlock text="{Binding Path=Name, Mode=OneWay}" 
5
répondu paparazzo 2011-07-20 17:20:55

Vous devez changer le MemberPath="{Binding Name}" en MemberPath="Name". Ensuite, cela fonctionnera.

5
répondu Emu 2013-04-05 12:05:12

Sinon, vous n'avez pas besoin de définir le DisplayMemberPath. vous pouvez simplement inclure un override ToString () dans votre objet qui est dans votre PromptList. comme ceci:

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

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

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

2
répondu JJ_Coder4Hire 2014-12-18 20:03:28