Różnica między SelectedItem, SelectedValue i SelectedValuePath

351

Jaka jest różnica między następującymi elementami:

Wszystkie te właściwości zależności są zdefiniowane w klasie Selector . Często mylę się SelectedItemz SelectedValuei SelectedValuezSelectedValuePath .

Chciałbym poznać różnicę między nimi, a także kiedy ich używamy, zwłaszcza SelectedValuei SelectedValuePath. Wyjaśnij ich użycie za pomocą kilku prostych przykładów.

Nawaz
źródło
3
Bea ma post na blogu z wyjaśnieniem i przykładowym kodem, który można pobrać ... bea.stollnitz.com/blog/?p=9
Aaron McIver
2
możliwy duplikat [Mylony z wpf ComboBox DisplayMemberPath, SelectedValue i SelectedValuePath] ( stackoverflow.com/questions/3797034/… )

Odpowiedzi:

552

Ich nazwy mogą być nieco mylące :). Oto podsumowanie:

  • Właściwość SelectedItem zwraca cały obiekt, z którym związana jest lista. Powiedzmy, że powiązałeś listę z kolekcjąCategory obiektów (każdy obiekt kategorii ma właściwości Nazwa i identyfikator). na przykład. ObservableCollection<Category>. SelectedItemWłasność zwróci ci aktualnie zaznaczonego Categoryobiektu. Jednak do celów wiązania nie zawsze jest to pożądane, ponieważ umożliwia jedynie powiązanie całego obiektu kategorii z właściwością, do której jest powiązana lista, a nie wartości pojedynczej właściwości tego obiektu kategorii (np. Jego IDwłaściwości ).

  • Dlatego mamy właściwość SelectedValuePath i SelectedValue jako alternatywny sposób wiązania (używasz ich w połączeniu ze sobą). Załóżmy, że masz Productobiekt, z którym związany jest Twój widok (z właściwościami takimi jak nazwa produktu, waga itp.). Załóżmy również, że masz CategoryIDwłaściwość tego obiektu produktu i chcesz, aby użytkownik mógł wybrać kategorię produktu z listy kategorii. Potrzebujesz właściwości ID obiektu Category, aby zostać przypisanym do CategoryIDwłaściwości obiektu Product. To gdzie SelectedValuePathiSelectedValuewłaściwości wchodzą. Określasz, że właściwość ID obiektu Category powinna być przypisana do właściwości obiektu Product, do którego lista jest zobowiązana SelectedValuePath='ID', a następnie powiążSelectedValue właściwość do właściwości w DataContext (tj. produkt).

Poniższy przykład to pokazuje. Mamy ComboBox powiązany z listą kategorii (poprzez ItemsSource). Wiązujemy właściwość CategoryID na produkcie jako wybraną wartość (za pomocą właściwości SelectedValue). Odnosimy to do właściwości identyfikatora kategorii za pośrednictwem właściwości SelectedValuePath. Mówimy tylko o wyświetlaniu właściwości Name w ComboBox z właściwością 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; }
}

Na początku jest to trochę mylące, ale mam nadzieję, że to sprawia, że ​​jest trochę jaśniej ... :)

Chris

Chris Anderson
źródło
8
Dziękuję za wyjaśnienie. Czy jesteś tym samym facetem, który napisał książkę o Silverlight? Nie wierzę, że z tobą rozmawiam. : -) ... Czytam teraz tę książkę. Naprawdę niesamowita praca. :-)
Nawaz
22
Tak, to ja :). Wałęsam się tutaj, by odpowiedzieć na pytania, kiedy tylko mogę. Cieszę się, że podoba ci się książka :). Ponieważ masz książkę, więcej informacji na ten temat znajdziesz na stronach 69-70 i na stronie 204.
Chris Anderson
8
+1. +100. Pan jest złotym bogiem wśród pomniejszych ludzi. Niech Bóg was błogosławi i wszystkim, którzy w was pływają. :) Poważnie, właśnie spędziłem dwie godziny, próbując to rozgryźć - dziękuję!
TarkaDaal
1
@Chris Anderson: Co jeśli obiekt Product ma właściwość Category (type Category) zamiast CategoryID? Jak mogę zaktualizować tę właściwość Kategoria po zmianie ComboBox poprzez wiązanie?
Lucyfer,
2
@Lucifer: W tym przypadku użyłbyś właściwości SelectedItem w taki sposób: <ComboBox ItemsSource = "{Binding Categories}" SelectedItem = "{Binding Category, Mode = TwoWay}" /> Mam nadzieję, że to pomoże.
Chris Anderson
69

Aby odpowiedzieć trochę bardziej koncepcyjnie:

SelectedValuePathokreśla, która właściwość (po nazwie) obiektów powiązanych z ListBox ItemsSourcezostanie użyta jako pozycjaSelectedValue .

Na przykład, jeśli Twój ListBox jest związany z kolekcji Personobiektów, z których każdy ma Name, Agei Genderwłaściwości SelectedValuePath=Namespowoduje, że wartość wybranego Person„s Namewłasności zostać zwrócone wSelectedValue .

Zauważ, że jeśli przesłonisz ControlTemplate ListBox (lub zastosujesz styl), który określa, jaka właściwość powinna być wyświetlana, SelectedValuePathnie będzie można użyć.

SelectedItemw międzyczasie zwraca całość Person aktualnie wybrany obiekt.

(Oto kolejny przykład z MSDN przy użyciu TreeView)

Aktualizacja: Jak wskazał @Joe, właściwość DisplayMemberPath nie jest powiązana z właściwościami Selected *. Prawidłowy opis jest następujący:

Zauważ, że wartości te różnią się od DisplayMemberPath(które są zdefiniowane w ItemsControl, nie w Selector), ale ta właściwość ma podobne zachowanie SelectedValuePath: w przypadku braku stylu / szablonu określa, która właściwość obiektu powiązanego z elementem powinna być użyta jako jego reprezentacja ciągu.

Dan J.
źródło
8

SelectedItemjest object. SelectedValuei SelectedValuePathstrings.

na przykład za pomocą ListBox:

jeśli powiesz „daj mi” listbox1.SelectedValue, zwróci tekst aktualnie wybranego elementu.

string value = listbox1.SelectedValue;

jeśli powiesz: daj mi listbox1.SelectedItem, da ci cały przedmiot.

ListItem item = listbox1.SelectedItem;
string value = item.value;
capdragon
źródło
3
SelectedValuejest również objecti nie string. Pls patrz tutaj
john_m
5

zainspirowany tym pytaniem napisałem tutaj blog wraz z fragmentem kodu . Poniżej znajdują się niektóre fragmenty bloga

SelectedItem - Selected Item pomaga powiązać rzeczywistą wartość ze źródła danych, które zostanie wyświetlone. Jest to obiekt typu i za pomocą tej właściwości możemy powiązać dowolny typ pochodzący z typu obiektu. Ponieważ w tym przypadku będziemy używać powiązania MVVM dla naszych pól kombi, jest to właściwość, której możemy użyć, aby powiadomić maszynę wirtualną o tym, że element został wybrany.

SelectedValue i SelectedValuePath - są to dwie najbardziej mylące i źle interpretowane właściwości combobox. Ale te właściwości przychodzą na ratunek, gdy chcemy powiązać nasz combobox z wartością z już utworzonego obiektu. Proszę sprawdzić mój ostatni scenariusz na poniższej liście, aby uzyskać krótki pogląd na temat właściwości.

Vikram
źródło
1

Każda kontrolka korzystająca z kolekcji do przechowywania danych ma właściwość SelectedValue, SelectedItem. Przykładami takich formantów są ListBox, Dropdown, RadioButtonList, CheckBoxList.

Aby być bardziej szczegółowym, jeśli dosłownie chcesz pobrać tekst wybranego elementu, możesz napisać:

ListBox1.SelectedItem.Text;

Twój ListBox1 może również zwracać tekst za pomocą właściwości SelectedValue, jeśli wcześniej ustawiono taką wartość. Ale powyżej jest bardziej skuteczny sposób na uzyskanie tekstu.

Teraz wartość jest niewidoczna dla użytkownika, ale służy głównie do przechowywania w bazie danych. Nie wstawiamy tekstu ListBox1, ale możemy go również wstawić, ale użyliśmy do wstawienia wartości wybranego elementu. Aby uzyskać wartość, możemy użyć

ListBox1.SelectedValue

Źródło

kamalpreet
źródło