SelectedItem, SelectedValue ve SelectedValuePath arasındaki fark


352

Aşağıdakiler arasındaki fark nedir:

Tüm bu bağımlılık özellikleri Selector sınıfında tanımlanır . Sık sık karıştırmayın SelectedItemile SelectedValueve SelectedValueile SelectedValuePath.

Aralarındaki farkı bilmek istiyorum, ayrıca ne zaman kullanıyoruz, özellikle SelectedValueve SelectedValuePath. Lütfen kullanımlarını bazı basit örneklerle açıklayınız .



2
[wpf ComboBox DisplayMemberPath, SelectedValue ve SelectedValuePath ile karışık] olası kopyası ( stackoverflow.com/questions/3797034/… )

Yanıtlar:


552

İsimleri biraz kafa karıştırıcı olabilir :). İşte bir özet:

  • SelectedItem özelliği listenizi bağlı olduğu tüm nesneyi döndürür. Diyelim ki bir liste bir Categorynesne koleksiyonuna bağlısınız (her bir Kategori nesnesinin Ad ve Kimlik özellikleri vardır). Örneğin. ObservableCollection<Category>. SelectedItemÖzelliğiniz Seçili dönecektir Categorynesneyi. Bununla birlikte, bağlayıcı amaçlar için, bu her zaman istediğiniz şey değildir, çünkü bu yalnızca tüm Kategori nesnesini listenin bağlı olduğu özelliğe bağlamanıza olanak tanır, bu Category nesnesindeki tek bir özelliğin ( IDözellik gibi) değerini değil ).

  • Bu nedenle , alternatif bir bağlanma aracı olarak SelectedValuePath ve SelectedValue özelliğine sahibiz (bunları birbirleriyle birlikte kullanırsınız). Diyelim ki görünümünüzün bağlı olduğu bir nesneniz var (ProductName, Weight, vb. Gibi özelliklerle). Ayrıca, söz konusu Ürün nesnesinde bir özelliğiniz olduğunu ve kullanıcının kategoriler listesinden ürün için bir kategori seçmesini istediğinizi varsayalım . Product nesnesindeki özelliğe atanmak için Category nesnesinin ID özelliğine ihtiyacınız vardır . Burası veProductCategoryIDCategoryIDSelectedValuePathSelectedValueCategory nesnesindeki ID özelliğinin, listenin bağlı olduğu Product nesnesindeki özelliğe atanması gerektiğini belirtirsiniz SelectedValuePath='ID've sonra SelectedValueözelliği DataContext (örneğin Ürün) üzerindeki özelliğe bağlarsınız.

Aşağıdaki örnek bunu göstermektedir. Kategoriler listesine bağlı bir ComboBox'ımız var (ItemsSource üzerinden). Ürün üzerindeki CategoryID özelliğini seçilen değer olarak bağlarız (SelectedValue özelliğini kullanarak). Bunu SelectedValuePath özelliği aracılığıyla Kategori'nin ID özelliğiyle ilişkilendiriyoruz. Ayrıca, yalnızca ComboBox öğesinde DisplayMemberPath özelliğiyle Name özelliğini görüntülüyoruz).

<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; }
}

Başlangıçta biraz kafa karıştırıcı, ama umarım bu biraz daha açıktır ... :)

Chris


8
Açıklama için teşekkürler. Silverlight hakkında kitap yazan aynı kişi misiniz? Seninle konuştuğuma inanmıyorum. : -) ... Bugünlerde bu kitabı okuyorum. Gerçekten harika bir iş. :-)
Nawaz

22
Evet, bu benim :). Mümkün olduğunda soruları cevaplamak için bu kısımların etrafında asılı duruyorum. Kitabın tadını çıkarmana sevindim :). Eğer kitap var olduğundan, daha fazla sayfa 69-70 bu konuda bilgi ve sayfayı 204. bulacaksınız
Chris Anderson

8
+1. 100. Siz, efendim, küçük insanlar arasında altın bir tanrısınız. Tanrı sizi kutsasın ve içinizde yelken edenler olsun. :) Cidden, ben bunu anlamaya çalışmak için sadece iki saat geçirdim - teşekkür ederim!
TarkaDaal

1
@Chris Anderson: Product nesnesinin CategoryID yerine Category özelliği (Category türü) varsa ne olur? Bağlama yoluyla ComboBox değişikliğinde bu Category özelliğini nasıl güncelleyebilirim?
Lucifer

2
@Lucifer: Bu durumda SelectedItem özelliğini şu şekilde kullanırsınız: <ComboBox ItemsSource = "{Binding Kategoriler}" SelectedItem = "{Binding Category, Mode = TwoWay}" /> Umarım bu yardımcı olur.
Chris Anderson

69

Kavramsal olarak biraz daha cevap vermek için:

SelectedValuePathListBox'lara bağlı nesnelerin hangi özelliğinin (adına göre) ItemsSourceöğe olarak kullanılacağını tanımlar SelectedValue.

Örneğin, eğer liste kutusu bir koleksiyon bağlı Personher biri vardır, Nesnelerin Name, Ageve Genderözellikleri, SelectedValuePath=Nameseçilen değerini neden olacaktır Person'ın Nameiçinde iade edilecek mal SelectedValue.

ListBox'ın ControlTemplate'i geçersiz kılarsanız (veya hangi özelliğin görüntülenmesi gerektiğini belirten bir stil uygularsanız) SelectedValuePathkullanılamayacağını unutmayın.

SelectedItem, bu arada, Personseçili olan tüm nesneyi döndürür .

(İşte , TreeView kullanan MSDN'den başka bir örnek )

Güncelleme: @Joe'nin işaret ettiği gibi, DisplayMemberPath özelliği Selected * özellikleri ile ilgisizdir. Doğru açıklaması aşağıdaki gibidir:

Bu değerlerin DisplayMemberPath(Selector değil, ItemsControl'de tanımlanır) farklı olduğunu, ancak bu özelliğin aşağıdakilere benzer bir davranışa sahip olduğunu unutmayın SelectedValuePath: stil / şablon olmadığında, öğeye bağlı nesnenin hangi özelliğinin dize gösterimi.


8

SelectedItembir object. SelectedValueve SelectedValuePathvardır strings.

örneğin ListBox kullanarak:

Bana ver derseniz listbox1.SelectedValue, seçili olan öğenin metnini döndürür.

string value = listbox1.SelectedValue;

Bana listbox1.SelectedItemver dersen, bütün nesneyi verecektir.

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

3
SelectedValueaynı zamanda bir objectve değil a string. Pls görmek burada
john_m

5

Bu sorudan esinlenerek burada kod pasajı ile birlikte bir blog yazdım . Aşağıda blogdan bazı alıntılar bulunmaktadır

SelectedItem - Seçili Öğe, görüntülenecek DataSource öğesinden gerçek değerin bağlanmasına yardımcı olur. Bu, type nesnesidir ve nesne türünden türetilen herhangi bir türü bu özellik ile bağlayabiliriz. Bu durumda birleşik giriş kutularımız için MVVM bağlayıcısını kullanacağımız için bu, VM'nin bu öğenin seçildiğini bildirmek için kullanabileceğimiz özelliktir.

SelectedValue ve SelectedValuePath - Bunlar, birleşik giriş kutusu için en kafa karıştırıcı ve yanlış yorumlanmış iki özelliktir. Ancak bu özellikler, birleşik giriş kutumuzu zaten oluşturulmuş nesneden gelen değerle bağlamak istediğimizde kurtarılmaya başlar. Özellikler hakkında kısa bir fikir edinmek için lütfen aşağıdaki listedeki son senaryomu kontrol edin.


1

Veri depolamak için Koleksiyonlar kullanan her denetim SelectedValue, SelectedItem özelliğine sahiptir. Bu denetimlere örnek olarak ListBox, Dropdown, RadioButtonList, CheckBoxList verilebilir.

Seçili Öğenin Metnini tam anlamıyla almak istiyorsanız daha spesifik olmak için şunu yazabilirsiniz:

ListBox1.SelectedItem.Text;

ListBox1 öğeniz, değer daha önce ayarlanmışsa SelectedValue özelliğini kullanarak Metin döndürebilir. Ancak yukarıda metin almanın daha etkili bir yoludur.

Şimdi, değer kullanıcı tarafından görülemeyen bir şeydir, ancak çoğunlukla veritabanında depolamak için kullanılır. ListBox1 Metnini eklemiyoruz, ancak onu da ekleyebiliriz, ancak seçilen öğenin değerini eklerdik. Değer almak için kullanabiliriz

ListBox1.SelectedValue

Kaynak

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.