web-dev-qa-db-fra.com

Différence entre SelectedItem, SelectedValue et SelectedValuePath

Quelle est la différence entre ce qui suit:

Toutes ces propriétés de dépendance sont définies dans la classe Selector . Je confonds souvent SelectedItem avec SelectedValue et SelectedValue avec SelectedValuePath.

Je voudrais savoir la différence entre eux, et aussi quand nous les utilisons, en particulier SelectedValue et SelectedValuePath. Veuillez expliquer leur utilisation avec quelques exemples simples.

329
Nawaz

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

  • La propriété SelectedItem renvoie l'intégralité de l'objet auquel votre liste est liée. Supposons donc que vous ayez lié une liste à une collection d'objets Category (chaque objet de la catégorie ayant les propriétés Name et ID). par exemple. ObservableCollection<Category>. La propriété SelectedItem vous renverra l'objet Category actuellement sélectionné. Toutefois, ce n'est pas toujours ce que vous souhaitez utiliser à des fins de liaison, car cela vous permet uniquement de lier un objet Category entier à la propriété à laquelle la liste est liée, et non à la valeur d'une propriété unique sur cet objet Category (tel que ID propriété).

  • Par conséquent, nous avons la propriété SelectedValuePath et la propriété SelectedValue comme moyen alternatif de liaison (vous les utilisez conjointement). Supposons que vous ayez un objet Product auquel votre vue est liée (avec des propriétés pour des éléments tels que ProductName, Weight, etc.). Supposons également que vous ayez une propriété CategoryID 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 propriété ID de l'objet Category à la propriété CategoryID de l'objet Product. C’est là que les propriétés SelectedValuePath et SelectedValue entrent en jeu. Vous indiquez que la propriété ID de l’objet Category doit être affectée à la propriété de l’objet Product à laquelle la liste est liée à l’utilisation de SelectedValuePath='ID', puis liez la propriété SelectedValue à la propriété sur le DataContext (c'est-à-dire le produit).

L'exemple ci-dessous le montre bien. Nous avons une ComboBox liée à 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 établissons un lien entre cette propriété et la propriété ID de la catégorie via la propriété SelectedValuePath. Et nous disons seulement afficher la propriété Name dans le contrô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ébut, mais j'espère que cela rend les choses un peu plus claires ... :)

Chris

519
Chris Anderson

Pour répondre un peu plus conceptuellement:

SelectedValuePath définit quelle propriété (par son nom) des objets liés au ItemsSource du ListBox sera utilisée en tant que SelectedValue de l'élément.

Par exemple, si votre contrôle ListBox est lié à une collection d'objets Person, chacun d'entre eux possédant les propriétés Name, Age et Gender, SelectedValuePath=Name renvoie la valeur de la propriété Person's sélectionnée Name dans SelectedValue.

Notez que si vous substituez le ControlTemplate du ListBox (ou appliquez un style) qui spécifie quelle propriété doit être affichée, SelectedValuePath ne peut pas être utilisé.

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

(Voici n autre exemple de MSDN , en utilisant TreeView)

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

Notez que ces valeurs sont distinctes de DisplayMemberPath (défini sur ItemsControl, pas Selector), mais que cette 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 à utiliser. comme sa représentation de chaîne.

65
Dan J

SelectedItem est un object. SelectedValue et SelectedValuePath sont strings.

par exemple en utilisant le ListBox:

si vous dites donnez-moi listbox1.SelectedValue, le texte de l'élément actuellement sélectionné sera renvoyé.

string value = listbox1.SelectedValue;

si vous dites donnez-moi listbox1.SelectedItem cela vous donnera l'objet entier.

ListItem item = listbox1.SelectedItem;
string value = item.value;
8
capdragon

inspiré par cette question, j'ai écrit un blog avec le extrait de code ici . Ci-dessous quelques extraits du blog

SelectedItem - L'élément sélectionné permet de lier la valeur réelle de la source de données à afficher. C'est du type objet et nous pouvons lier n'importe quel type dérivé du type d'objet avec cette propriété. Étant donné que nous allons utiliser la liaison MVVM pour nos listes déroulantes, il s'agit de la propriété que nous pouvons utiliser pour notifier VM cet élément a été sélectionné.

SelectedValue et SelectedValuePath - Il s'agit des deux propriétés les plus déroutantes et les plus mal interprétées de la liste déroulante. Mais ces propriétés viennent à la rescousse lorsque nous voulons lier notre liste déroulante à la valeur d'un objet déjà créé. S'il vous plaît vérifier mon dernier scénario dans la liste suivante pour avoir une brève idée sur les propriétés.

5
Vikram

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

Pour être plus précis, si vous voulez 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. 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 aussi l'insérer, mais nous utilisions auparavant la valeur de l'élément sélectionné. Pour obtenir de la valeur, nous pouvons utiliser

ListBox1.SelectedValue

Source

1
kamalpreet