Perbedaan antara SelectedItem, SelectedValue, dan SelectedValuePath

351

Apa perbedaan antara berikut ini:

Semua properti ketergantungan ini didefinisikan di kelas Pemilih . Saya sering bingung SelectedItemdengan SelectedValue, dan SelectedValuedengan SelectedValuePath.

Saya ingin tahu perbedaan di antara mereka, dan kapan kami menggunakannya, terutama SelectedValuedan SelectedValuePath. Tolong jelaskan penggunaannya dengan beberapa contoh sederhana.

Nawaz
sumber
3
Bea memiliki posting blog dengan penjelasan dan kode sampel yang dapat Anda unduh ... bea.stollnitz.com/blog/?p=9
Aaron McIver
2
kemungkinan duplikat [Bingung dengan wpf ComboBox DisplayMemberPath, SelectedValue, dan SelectedValuePath] ( stackoverflow.com/questions/3797034/… )

Jawaban:

552

Nama mereka bisa sedikit membingungkan :). Berikut ringkasannya:

  • The SelectedItem properti mengembalikan seluruh objek yang daftar Anda terikat untuk. Jadi katakanlah Anda telah mengikat daftar ke kumpulan Categoryobjek (dengan setiap objek Kategori memiliki properti Nama dan ID). misalnya. ObservableCollection<Category>. The SelectedItemproperti akan kembali Anda sedang dipilih Categoryobjek. Namun untuk tujuan yang mengikat, ini tidak selalu seperti yang Anda inginkan, karena ini hanya memungkinkan Anda untuk mengikat seluruh objek Kategori ke properti yang terikat daftar, bukan nilai properti tunggal pada objek Kategori tersebut (seperti IDpropertinya ).

  • Oleh karena itu kami memiliki properti SelectedValuePath dan properti SelectedValue sebagai cara alternatif untuk mengikat (Anda menggunakannya bersama satu sama lain). Katakanlah Anda memiliki Productobjek, yang terikat dengan pandangan Anda (dengan properti untuk hal-hal seperti ProductName, Weight, dll). Katakan juga Anda memiliki CategoryIDproperti pada objek Produk itu, dan Anda ingin pengguna dapat memilih kategori untuk produk dari daftar kategori. Anda memerlukan properti ID objek Kategori untuk ditugaskan ke CategoryIDproperti pada objek Produk. Di sinilah tempat SelectedValuePathdanSelectedValueproperti masuk. Anda menentukan bahwa properti ID pada objek Kategori harus ditugaskan ke properti pada objek Produk yang terikat daftar untuk menggunakan SelectedValuePath='ID', dan kemudian mengikat SelectedValueproperti ke properti pada DataContext (mis. Produk).

Contoh di bawah ini menunjukkan ini. Kami memiliki ComboBox terikat ke daftar Kategori (melalui ItemsSource). Kami mengikat properti CategoryID pada Produk sebagai nilai yang dipilih (menggunakan properti SelectedValue). Kami menghubungkan ini dengan properti ID Kategori melalui properti SelectedValuePath. Dan kami katakan hanya tampilkan properti Name di ComboBox, dengan properti 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; }
}

Awalnya agak membingungkan, tapi semoga ini membuatnya sedikit lebih jelas ... :)

Chris

Chris Anderson
sumber
8
Terima kasih untuk penjelasannya. Apakah Anda orang yang sama yang telah menulis buku tentang Silverlight? Saya tidak percaya saya berbicara dengan Anda. : -) ... Saya sedang membaca buku ini saat ini. Benar-benar karya yang luar biasa. :-)
Nawaz
22
Yap, itu saya :). Saya berkeliaran di sini bagian untuk menjawab pertanyaan ketika saya bisa. Senang Anda menikmati bukunya :). Karena Anda sudah mendapatkan buku itu, Anda akan menemukan informasi lebih lanjut tentang topik ini di halaman 69-70, dan halaman 204.
Chris Anderson
8
+1. +100. Anda, Tuan, adalah dewa emas di antara pria yang lebih rendah. Semoga Tuhan memberkati Anda, dan semua yang berlayar di dalam Anda. :) Serius, saya hanya menghabiskan dua jam mencoba mencari tahu - terima kasih!
TarkaDaal
1
@ Chris Anderson: Bagaimana jika objek Produk memiliki properti Kategori (ketik Kategori) alih-alih CategoryID? Bagaimana saya bisa memperbarui properti Kategori ini pada perubahan ComboBox melalui ikatan?
Lucifer
2
@Lucifer: Dalam hal ini Anda akan menggunakan properti SelectedItem seperti: <ComboBox ItemsSource = "{Binding Categories}" SelectedItem = "{Kategori Binding, Mode = TwoWay}" /> Semoga ini bisa membantu.
Chris Anderson
69

Untuk menjawab sedikit lebih konseptual:

SelectedValuePathmendefinisikan properti mana (dengan namanya) dari objek yang terikat pada ListBox ItemsSourceakan digunakan sebagai item SelectedValue.

Misalnya, jika ListBox Anda terikat untuk koleksi Personbenda-benda, masing-masing memiliki Name, Age, dan Genderproperti, SelectedValuePath=Nameakan menyebabkan nilai yang dipilih Person's Nameproperti akan dikembalikan SelectedValue.

Perhatikan bahwa jika Anda mengganti ControlTemplate ListBox (atau menerapkan Style) yang menentukan properti apa yang harus ditampilkan, SelectedValuePathtidak dapat digunakan.

SelectedItem, sementara itu, mengembalikan seluruh Personobjek yang saat ini dipilih.

(Berikut contoh lebih lanjut dari MSDN , menggunakan TreeView)

Pembaruan: Seperti yang ditunjukkan @ Jo, properti DisplayMemberPath tidak terkait dengan properti * yang Dipilih. Deskripsi yang tepat berikut:

Perhatikan bahwa nilai-nilai ini berbeda dari DisplayMemberPath(yang didefinisikan pada ItemsControl, bukan Selector), tetapi properti itu memiliki perilaku yang mirip dengan SelectedValuePath: dengan tidak adanya gaya / templat, ini mengidentifikasi properti objek yang terikat pada item yang harus digunakan sebagai properti representasi string.

Dan J
sumber
8

SelectedItemadalah sebuah object. SelectedValuedan SelectedValuePathyang strings.

misalnya menggunakan ListBox:

jika Anda mengatakan beri saya listbox1.SelectedValueitu akan mengembalikan teks dari item yang dipilih saat ini.

string value = listbox1.SelectedValue;

jika Anda mengatakan memberi saya listbox1.SelectedItemitu akan memberi Anda seluruh objek.

ListItem item = listbox1.SelectedItem;
string value = item.value;
capdragon
sumber
3
SelectedValuejuga merupakan objectdan bukan string.
Tolong
5

terinspirasi oleh pertanyaan ini saya telah menulis sebuah blog bersama dengan potongan kode di sini . Di bawah ini adalah beberapa kutipan dari blog

SelectedItem - Item yang Dipilih membantu untuk mengikat nilai aktual dari DataSource yang akan ditampilkan. Ini adalah tipe objek dan kita dapat mengikat semua tipe yang berasal dari tipe objek dengan properti ini. Karena kami akan menggunakan MVVM yang mengikat untuk kotak kombo kami dalam hal ini, ini adalah properti yang dapat kami gunakan untuk memberi tahu VM bahwa item telah dipilih.

SelectedValue dan SelectedValuePath - Ini adalah dua properti yang paling membingungkan dan salah tafsir untuk combobox. Tetapi properti ini datang untuk menyelamatkan ketika kita ingin mengikat kotak kombo kita dengan nilai dari objek yang sudah dibuat. Silakan periksa skenario terakhir saya di daftar berikut untuk mendapatkan ide singkat tentang properti.

Vikram
sumber
1

Setiap kontrol yang menggunakan Koleksi untuk menyimpan data memiliki properti SelectedValue, SelectedItem. Contoh kontrol ini adalah ListBox, Dropdown, RadioButtonList, CheckBoxList.

Untuk lebih spesifik jika Anda benar-benar ingin mengambil Teks dari Item yang Dipilih maka Anda dapat menulis:

ListBox1.SelectedItem.Text;

ListBox1 Anda juga dapat mengembalikan Teks menggunakan properti SelectedValue jika nilainya telah disetel sebelumnya. Tetapi cara di atas lebih efektif untuk mendapatkan teks.

Sekarang, nilainya adalah sesuatu yang tidak terlihat oleh pengguna tetapi sebagian besar digunakan untuk menyimpan dalam database. Kami tidak memasukkan Teks ListBox1, namun kami juga bisa menyisipkannya, tetapi kami biasa memasukkan nilai item yang dipilih. Untuk mendapatkan nilai bisa kita gunakan

ListBox1.SelectedValue

Sumber

kamalpreet
sumber