Differenza tra SelectedItem, SelectedValue e SelectedValuePath


351

Qual è la differenza tra quanto segue:

Tutte queste proprietà di dipendenza sono definite nella classe Selector . Mi confondo spesso SelectedItemcon SelectedValuee SelectedValuecon SelectedValuePath.

Vorrei sapere la differenza tra loro, e anche quando li usiamo, specialmente SelectedValuee SelectedValuePath. Spiega il loro uso con alcuni semplici esempi.


3
Bea ha un post sul blog con spiegazione e codice di esempio che puoi scaricare ... bea.stollnitz.com/blog/?p=9
Aaron McIver

2
Eventuali duplicati di [Confuso con WPF ComboBox DisplayMemberPath, SelectedValue e SelectedValuePath] ( stackoverflow.com/questions/3797034/... )

Risposte:


552

I loro nomi possono essere un po 'confusi :). Ecco un riassunto:

  • La proprietà SelectedItem restituisce l'intero oggetto a cui è associato l'elenco. Supponiamo quindi di aver associato un elenco a una raccolta di Categoryoggetti (con ogni oggetto Categoria con proprietà Nome e ID). per esempio. ObservableCollection<Category>. La SelectedItemproprietà restituirà l' Categoryoggetto attualmente selezionato . Tuttavia, ai fini dell'associazione, questo non è sempre ciò che si desidera, poiché ciò consente solo di associare un intero oggetto Categoria alla proprietà a cui è associato l'elenco, non il valore di una singola proprietà sull'oggetto Categoria (come la sua IDproprietà ).

  • Pertanto, abbiamo la proprietà SelectedValuePath e la proprietà SelectedValue come mezzo alternativo di associazione (le usi insieme). Supponiamo che tu abbia un Productoggetto a cui è legata la tua vista (con proprietà per cose come ProductName, Weight, ecc.). Supponiamo anche che tu abbia una CategoryIDproprietà su quell'oggetto Prodotto e desideri che l'utente sia in grado di selezionare una categoria per il prodotto da un elenco di categorie. È necessario che la proprietà ID dell'oggetto Categoria sia assegnata alla CategoryIDproprietà sull'oggetto Prodotto. Questo è dove il SelectedValuePathe ilSelectedValueentrano in proprietà. Si specifica che la proprietà ID sull'oggetto Categoria deve essere assegnata alla proprietà sull'oggetto Prodotto che l'elenco deve utilizzare SelectedValuePath='ID', quindi associare la SelectedValueproprietà alla proprietà su DataContext (ad es. il Prodotto).

L'esempio seguente lo dimostra. Abbiamo un ComboBox associato a un elenco di categorie (tramite ItemsSource). Stiamo vincolando la proprietà CategoryID sul Prodotto come valore selezionato (utilizzando la proprietà SelectedValue). Lo stiamo mettendo in relazione con la proprietà ID della categoria tramite la proprietà SelectedValuePath. E stiamo dicendo di visualizzare solo la proprietà Name in ComboBox, con la proprietà 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; }
}

Inizialmente è un po 'confuso, ma speriamo che questo lo renda un po' più chiaro ... :)

Chris


8
Grazie per la spiegazione. Sei lo stesso ragazzo che ha scritto un libro su Silverlight? Non credo di parlarti. : -) ... Oggi sto leggendo questo libro. Davvero un lavoro fantastico. :-)
Nawaz

22
Sì, sono io :). Vado in giro qui queste parti per rispondere alle domande quando posso. Sono contento che ti piaccia il libro :). Dato che hai il libro, troverai maggiori informazioni su questo argomento alle pagine 69-70 e pagina 204.
Chris Anderson,

8
+1. +100. Lei, signore, è un dio d'oro tra gli uomini minori. Che Dio ti benedica e tutti coloro che navigano in te. :) Seriamente, ho appena trascorso due ore a cercare di capirlo - grazie!
TarkaDaal,

1
@ Chris Anderson: cosa succede se l'oggetto Prodotto ha una proprietà Categoria (tipo Categoria) anziché un IDCategoria? Come posso aggiornare questa proprietà di categoria sulla modifica di ComboBox tramite associazione?
Lucifero,

2
@Lucifer: In questo caso useresti la proprietà SelectedItem in questo modo: <ComboBox ItemsSource = "{Binding Categories}" SelectedItem = "{Binding Category, Mode = TwoWay}" /> Spero che questo ti aiuti.
Chris Anderson,

69

Per rispondere un po 'più concettualmente:

SelectedValuePathdefinisce quale proprietà (con il suo nome) degli oggetti associati a ListBox ItemsSourceverrà utilizzata come elemento SelectedValue.

Ad esempio, se il ListBox è associato a un insieme di Personoggetti, ognuno dei quali ha Name, Agee Genderle proprietà, SelectedValuePath=Namefarà sì che il valore della scelta Person's Nameproprietà da restituire in SelectedValue.

Notare che se si sostituisce ControlTemplate di ListBox (o si applica uno stile) che specifica quale proprietà deve essere visualizzata, SelectedValuePathnon può essere utilizzata.

SelectedItem, nel frattempo, restituisce l'intero Personoggetto attualmente selezionato.

(Ecco un ulteriore esempio da MSDN , usando TreeView)

Aggiornamento: come sottolineato da @Joe, la proprietà DisplayMemberPath non è correlata alle proprietà Selected *. Segue la descrizione corretta:

Si noti che questi valori sono distinti da DisplayMemberPath(che è definito su ItemsControl, non Selector), ma quella proprietà ha un comportamento simile a SelectedValuePath: in assenza di uno stile / modello, identifica quale proprietà dell'oggetto associato all'elemento dovrebbe essere usata come sua rappresentazione di stringhe.


8

SelectedItemè un object. SelectedValuee SelectedValuePathsono strings.

ad esempio usando ListBox:

se dici dammi listbox1.SelectedValuerestituirà il testo dell'elemento attualmente selezionato.

string value = listbox1.SelectedValue;

se dici dammi listbox1.SelectedItemti darà l'intero oggetto.

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

3
SelectedValueè anche un objecte non un string. Per favore vedi qui
john_m

5

ispirato da questa domanda ho scritto un blog insieme allo snippet di codice qui . Di seguito sono riportati alcuni estratti del blog

SelectedItem: l'elemento selezionato consente di associare il valore effettivo all'origine dati che verrà visualizzata. Questo è di tipo object e possiamo associare qualsiasi tipo derivato dal tipo di oggetto con questa proprietà. Poiché in quel caso utilizzeremo l'associazione MVVM per le nostre caselle combinate, questa è la proprietà che possiamo utilizzare per notificare alla VM che l'elemento è stato selezionato.

SelectedValue e SelectedValuePath: queste sono le due proprietà più confuse e male interpretate per la casella combinata. Ma queste proprietà vengono in soccorso quando vogliamo associare la nostra casella combinata con il valore di un oggetto già creato. Si prega di controllare il mio ultimo scenario nel seguente elenco per avere una breve idea delle proprietà.


1

Ogni controllo che utilizza le raccolte per archiviare i dati ha SelectedValue, proprietà SelectedItem. Esempi di questi controlli sono ListBox, Dropdown, RadioButtonList, CheckBoxList.

Per essere più specifici se desideri letteralmente recuperare il testo dell'elemento selezionato, puoi scrivere:

ListBox1.SelectedItem.Text;

ListBox1 può anche restituire testo utilizzando la proprietà SelectedValue se il valore è impostato su quello precedente. Ma sopra è il modo più efficace per ottenere testo.

Ora, il valore è qualcosa che non è visibile all'utente ma viene utilizzato principalmente per l'archiviazione nel database. Non inseriamo il testo di ListBox1, tuttavia possiamo anche inserirlo, ma abbiamo usato per inserire il valore dell'elemento selezionato. Per ottenere valore possiamo usare

ListBox1.SelectedValue

fonte

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.