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.
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
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.
SelectedItem
est un object
. SelectedValue
et SelectedValuePath
sont string
s.
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;
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.
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