Différence entre SelectedItem, SelectedValue et SelectedValuePath

352

Quelle est la différence entre les éléments suivants:

Toutes ces propriétés de dépendance sont définies dans la classe Selector . Je confond souvent SelectedItemavec SelectedValueet SelectedValueavec SelectedValuePath.

Je voudrais connaître la différence entre eux, et aussi quand les utilisons-nous, en particulier SelectedValueet SelectedValuePath. Veuillez expliquer leur utilisation avec quelques exemples simples.

Nawaz
la source
3
Bea a un article de blog avec des explications et un exemple de code que vous pouvez télécharger ... bea.stollnitz.com/blog/?p=9
Aaron McIver
2
doublon possible de [Confused with wpf ComboBox DisplayMemberPath, SelectedValue and SelectedValuePath] ( stackoverflow.com/questions/3797034/… )

Réponses:

552

Leurs noms peuvent être un peu déroutants :). Voici un résumé:

  • La propriété SelectedItem renvoie l'objet entier auquel votre liste est liée. Supposons donc que vous ayez lié une liste à une collection d' Categoryobjets (chaque objet Category ayant des propriétés Name et ID). par exemple. ObservableCollection<Category>. La SelectedItempropriété vous renverra l' Categoryobjet actuellement sélectionné . À des fins de liaison, cependant, ce n'est pas toujours ce que vous voulez, car cela vous permet uniquement de lier un objet Category entier à la propriété à laquelle la liste est liée, pas la valeur d'une propriété unique sur cet objet Category (comme sa IDpropriété ).

  • Par conséquent, nous avons la propriété SelectedValuePath et la propriété SelectedValue comme un autre moyen de liaison (vous les utilisez conjointement). Disons que vous avez un Productobjet auquel votre vue est liée (avec des propriétés pour des choses comme ProductName, Weight, etc.). Supposons également que vous ayez une CategoryIDpropriété sur cet objet Product et que vous souhaitiez que l'utilisateur puisse sélectionner une catégorie pour le produit dans une liste de catégories. Vous devez affecter la CategoryIDpropriété ID de l'objet Category à la propriété de l'objet Product. C'est là que le SelectedValuePathet leSelectedValue propriétés entre. Vous spécifiez que la propriété ID sur l'objet Category doit être affectée à la propriété sur l'objet Product que la liste est liée à utiliser SelectedValuePath='ID', puis liez leSelectedValue propriété à la propriété sur le DataContext (c'est-à-dire le produit).

L'exemple ci-dessous le démontre. Nous avons un ComboBox lié à une liste de catégories (via ItemsSource). Nous lions la propriété CategoryID sur le produit en tant que valeur sélectionnée (à l'aide de la propriété SelectedValue). Nous associons cela à la propriété ID de la catégorie via la propriété SelectedValuePath. Et nous disons seulement afficher la propriété Name dans le ComboBox, avec la propriété DisplayMemberPath).

<ComboBox ItemsSource="{Binding Categories}" 
          SelectedValue="{Binding CategoryID, Mode=TwoWay}" 
          SelectedValuePath="ID" 
          DisplayMemberPath="Name" />
public class Category
{
    public int ID { get; set; }
    public string Name { get; set; }
}

public class Product
{
    public int CategoryID { get; set; }
}

C'est un peu déroutant au départ, mais j'espère que cela le rend un peu plus clair ... :)

Chris

Chris Anderson
la source
8
Merci pour l'explication. Êtes-vous le même gars qui a écrit un livre sur Silverlight? Je ne crois pas que je te parle. : -) ... Je lis ce livre de nos jours. Vraiment un travail génial. :-)
Nawaz
22
Oui, c'est moi :). Je traîne ces parties ici pour répondre aux questions quand je le peux. Heureux que vous appréciez le livre :). Puisque vous avez le livre, vous trouverez plus d'informations sur ce sujet aux pages 69-70 et page 204.
Chris Anderson
8
+1. +100. Vous, monsieur, êtes un dieu en or parmi les petits hommes. Que Dieu vous bénisse et tous ceux qui naviguent en vous. :) Sérieusement, je viens de passer deux heures à essayer de comprendre cela - merci!
TarkaDaal
1
@Chris Anderson: Que faire si l'objet Product a une propriété Category (type Category) au lieu d'un CategoryID? Comment puis-je mettre à jour cette propriété Category lors du changement de ComboBox via la liaison?
Lucifer
2
@Lucifer: Dans ce cas, vous utiliseriez la propriété SelectedItem comme ceci: <ComboBox ItemsSource = "{Binding Categories}" SelectedItem = "{Binding Category, Mode = TwoWay}" /> J'espère que cela vous aidera.
Chris Anderson
69

Pour répondre un peu plus conceptuellement:

SelectedValuePathdéfinit quelle propriété (par son nom) des objets liés au ListBox ItemsSourcesera utilisé comme élémentSelectedValue .

Par exemple, si votre ListBox est lié à une collection d' Personobjets, dont chacun a Name, Ageet des Genderpropriétés, SelectedValuePath=Nameprovoquera la valeur de la sélectionnée Personde la Namepropriété à retourner dansSelectedValue .

Notez que si vous remplacez le ControlTemplate de ListBox (ou appliquez un style) qui spécifie la propriété à afficher, SelectedValuePathne peut pas être utilisé.

SelectedItem, quant à lui, renvoie l'intégralité de l' Personobjet actuellement sélectionné.

(Voici un autre exemple de MSDN , utilisant TreeView)

Mise à jour: Comme l'a souligné @Joe, la propriété DisplayMemberPath n'est pas liée aux propriétés Selected *. Sa description appropriée suit:

Notez que ces valeurs sont distinctes de DisplayMemberPath(qui est définie sur ItemsControl, pas Selector), mais que la propriété a un comportement similaire à SelectedValuePath: en l'absence d'un style / modèle, elle identifie la propriété de l'objet lié à l'élément qui doit être utilisée comme son représentation de chaîne.

Dan J
la source
8

SelectedItemest un object. SelectedValueet SelectedValuePathsont l' stringart.

par exemple en utilisant le ListBox:

si vous dites me donner, listbox1.SelectedValueil renverra le texte de l'élément actuellement sélectionné.

string value = listbox1.SelectedValue;

si vous dites donnez-moi, listbox1.SelectedItemcela vous donnera tout l'objet.

ListItem item = listbox1.SelectedItem;
string value = item.value;
capdragon
la source
3
SelectedValueest aussi un objectet non un string. Pls voir ici
john_m
5

inspiré par cette question, j'ai écrit un blog avec l' extrait de code ici . Vous trouverez ci-dessous quelques extraits du blog

SelectedItem - L'élément sélectionné permet de lier la valeur réelle de la DataSource qui sera affichée. C'est de type objet et nous pouvons lier n'importe quel type dérivé de type d'objet avec cette propriété. Étant donné que nous utiliserons la liaison MVVM pour nos zones de liste déroulante dans ce cas, c'est la propriété que nous pouvons utiliser pour informer VM que l'élément a été sélectionné.

SelectedValue et SelectedValuePath - Ce sont les deux propriétés les plus déroutantes et mal interprétées pour la zone de liste déroulante. Mais ces propriétés viennent à notre secours lorsque nous voulons lier notre combobox avec la valeur d'un objet déjà créé. Veuillez vérifier mon dernier scénario dans la liste suivante pour avoir une brève idée des propriétés.

Vikram
la source
1

Chaque contrôle qui utilise des collections pour stocker des données possède la propriété SelectedValue, SelectedItem. Des exemples de ces contrôles sont ListBox, Dropdown, RadioButtonList, CheckBoxList.

Pour être plus précis si vous voulez littéralement récupérer le texte de l'élément sélectionné, vous pouvez écrire:

ListBox1.SelectedItem.Text;

Votre ListBox1 peut également renvoyer du texte en utilisant la propriété SelectedValue si la valeur a déjà été définie sur celle-ci. Mais ci-dessus est un moyen plus efficace d'obtenir du texte.

Maintenant, la valeur est quelque chose qui n'est pas visible pour l'utilisateur, mais elle est principalement utilisée pour stocker dans la base de données. Nous n'insérons pas le texte de ListBox1, mais nous pouvons également l'insérer, mais nous avons utilisé pour insérer la valeur de l'élément sélectionné. Pour obtenir de la valeur, nous pouvons utiliser

ListBox1.SelectedValue

La source

kamalpreet
la source