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?
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}"
.
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
.
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}"
Vous devez changer le MemberPath="{Binding Name}"
en MemberPath="Name"
. Ensuite, cela fonctionnera.
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.