Differenza tra SelectedItem, SelectedValue e SelectedValuePath

Qual è la differenza tra i seguenti:

  • SelectedItem
  • SelectedValue
  • SelectedValuePath

Tutte queste proprietà di dipendenza sono definite nella class Selector . Confondo spesso SelectedItem con SelectedValue e SelectedValue con SelectedValuePath .

Vorrei sapere la differenza tra loro e anche quando li usiamo, in particolare SelectedValue e SelectedValuePath . Si prega di spiegare il loro uso con alcuni semplici esempi.

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

  • La proprietà SelectedItem restituisce l’intero object a cui è associato l’elenco. Ad esempio, hai associato un elenco a una raccolta di oggetti di Category (con ogni object di categoria con proprietà Name e ID). per esempio. ObservableCollection . La proprietà SelectedItem restituirà l’object Category attualmente selezionato. Tuttavia, per scopi di binding, questo non è sempre quello che vuoi, in quanto ciò ti consente solo di associare un intero object Category alla proprietà a cui è legato l’elenco, non il valore di una singola proprietà su quell’object Category (come il suo ID proprietà).

  • Pertanto abbiamo la proprietà SelectedValuePath e la proprietà SelectedValue come mezzo alternativo di associazione (li usi in combinazione tra loro). Supponiamo che tu abbia un object Product , a cui è associata la tua vista (con proprietà per cose come ProductName, Weight, ecc.). Diciamo anche che hai una proprietà CategoryID su quell’object Product e vuoi che l’utente sia in grado di selezionare una categoria per il prodotto da un elenco di categorie. È necessario che la proprietà ID dell’object Category sia assegnata alla proprietà IDCategoria sull’object Product. È qui che entrano in gioco le proprietà SelectedValuePath e SelectedValue . Si specifica che la proprietà ID sull’object Category deve essere assegnata alla proprietà sull’object Product che l’elenco è associato a SelectedValuePath='ID' e quindi associare SelectedValue proprietà alla proprietà sul DataContext (cioè il prodotto).

L’esempio qui sotto lo dimostra. Abbiamo un ComboBox associato a un elenco di categorie (tramite ItemsSource). Stiamo vincolando la proprietà IDCategoria 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 nel ComboBox, con la proprietà DisplayMemberPath).

  

Inizialmente è un po ‘confuso, ma spero che questo lo renda un po’ più chiaro … 🙂

Chris

Per rispondere un po ‘più concettualmente:

SelectedValuePath definisce quale proprietà (in base al suo nome) degli oggetti associati a ItemsSource del ListBox verrà utilizzata come SelectedValue dell’object.

Ad esempio, se il tuo ListBox è associato a una raccolta di oggetti Person , ognuno dei quali ha proprietà Name , Age e Gender , SelectedValuePath=Name , restituirà il valore della proprietà Name Person selezionata in SelectedValue .

Si noti che se si esegue l’override del ControlTemplate di ListBox (o si applica uno stile) che specifica quale proprietà deve essere visualizzata, SelectedValuePath non può essere utilizzato.

SelectedItem , nel frattempo, restituisce l’intero object Person attualmente selezionato.

(Ecco un altro esempio da MSDN , usando TreeView)

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

Si noti che questi valori sono distinti da DisplayMemberPath (che è definito su ItemsControl, non su Selector), ma tale proprietà ha un comportamento simile a SelectedValuePath : in assenza di uno stile / modello, identifica la proprietà dell’object associato all’elemento da utilizzare come la sua rappresentazione di stringa.

SelectedItem è un object . SelectedValue e SelectedValuePath sono string .

per esempio usando il ListBox:

se dici dammi listbox1.SelectedValue restituirà il testo dell’elemento attualmente selezionato.

 string value = listbox1.SelectedValue; 

se dici dammi listbox1.SelectedItem ti darà l’intero object.

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

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

SelectedItem: l’elemento selezionato consente di associare il valore effettivo al DataSource che verrà visualizzato. Questo è di tipo object e possiamo associare qualsiasi tipo derivato dal tipo di object con questa proprietà. Poiché utilizzeremo il binding MVVM per le nostre caselle combinate in questo caso, 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 di combobox. Ma queste proprietà vengono in soccorso quando vogliamo associare la nostra casella combinata al valore dell’object già creato. Si prega di controllare il mio ultimo scenario nel seguente elenco per avere un’idea breve delle proprietà.

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

Per essere più specifico se vuoi letteralmente recuperare il testo dell’elemento selezionato, puoi scrivere:

 ListBox1.SelectedItem.Text; 

Il tuo ListBox1 può anche restituire il testo usando la proprietà SelectedValue se il valore è stato impostato su quello prima. Ma sopra è il modo più efficace per ottenere il testo.

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

 ListBox1.SelectedValue