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

Jaka jest różnica między:

Wszystkie te właściwości zależności są zdefiniowane w klasie Selektor . Często mylę SelectedItem z SelectedValue , A SelectedValue z SelectedValuePath.

Chciałbym poznać różnicę między nimi, a także kiedy ich używamy, szczególnie SelectedValue i SelectedValuePath. Proszę wyjaśnić ich użycie z kilkoma prostymi przykładami.

Author: Nawaz, 2011-02-04

5 answers

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

  • Właściwość SelectedItem zwraca cały obiekt, do którego przypisana jest lista. Załóżmy, że powiązałeś listę z kolekcją obiektów Category (każdy obiekt kategorii ma właściwości Name i ID). np. ObservableCollection<Category>. Właściwość SelectedItem zwróci aktualnie wybrany obiekt Category. Dla celów wiążących jednak nie zawsze jest to to, czego chcesz, ponieważ umożliwia to tylko Związanie całego Obiekt kategorii do właściwości, do której przypisana jest lista, a nie wartość pojedynczej właściwości obiektu kategorii (np. jego właściwości ID).

  • Dlatego mamy właściwość SelectedValuePath i właściwość SelectedValue jako alternatywny sposób wiązania(używasz ich w połączeniu ze sobą). Załóżmy, że masz obiekt Product, do którego jest przypisany twój widok (z właściwościami takimi jak Nazwa produktu, waga itp.). Powiedzmy też na tym obiekcie produktu znajduje się właściwość CategoryID i chcesz, aby użytkownik mógł wybrać kategorię dla produktu z listy kategorii. Właściwość ID obiektu kategorii musi być przypisana do właściwości CategoryID obiektu Produktu. Tutaj pojawiają się właściwości SelectedValuePath i SelectedValue. Określa się, że właściwość ID w obiekcie kategorii powinna być przypisana do właściwości w obiekcie produktu, do którego lista jest powiązana za pomocą SelectedValuePath='ID', a następnie wiąże SelectedValue właściwość do właściwości na DataContext (tj. produkt).

Ilustruje to poniższy przykład. Mamy ComboBox związany z listą kategorii (za pośrednictwem ItemsSource). Przypisujemy właściwość CategoryID produktu jako wybraną wartość(używając właściwości SelectedValue). Odnosimy to do właściwości ID kategorii za pomocą właściwości SelectedValuePath. I mówimy, że wyświetla tylko właściwość Name w Comboboxie, z DisplayMemberPath nieruchomości).

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

Początkowo jest to trochę mylące, ale mam nadzieję, że to sprawi, że będzie to nieco jaśniejsze... :)

Chris

 575
Author: Chris Anderson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-08-18 10:34:14

Aby odpowiedzieć trochę bardziej koncepcyjnie:

SelectedValuePath określa, która właściwość (poprzez swoją nazwę) obiektów związanych z listboxem ItemsSource będzie używana jako element SelectedValue.

Na przykład, jeśli ListBox jest powiązany ze zbiorem obiektów Person, z których każdy ma Name, Age, i właściwości Gender, SelectedValuePath=Name spowoduje, że wartość wybranej właściwości Person S Name zostanie zwrócona w SelectedValue.

zauważ, że jeśli nadpiszesz ControlTemplate listy (lub zastosować styl), który określa, jaka właściwość ma być wyświetlana, nie można użyć SelectedValuePath.

SelectedItem, W międzyczasie zwraca cały Person aktualnie wybrany obiekt.

Jeśli nie masz jeszcze konta w usłudze MSDN, możesz skorzystać z funkcji TreeView.]}

aktualizacja: Jak zauważył @ Joe, właściwość DisplayMemberPath nie jest powiązana z wybranymi właściwościami*. Jego właściwy opis jest następujący:

Zauważ, że wartości te różnią się od DisplayMemberPath (co jest zdefiniowane na ItemsControl, Nie Selektor), ale właściwość ta ma podobne zachowanie do SelectedValuePath: W przypadku braku stylu/szablonu określa, która właściwość obiektu związanego z item powinna być użyta jako jego reprezentacja łańcuchowa.

 72
Author: Dan J,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-20 15:46:37

SelectedItem jest object. SelectedValue i SelectedValuePathstring s.

Na przykład używając ListBox:

Jeśli powiesz give me listbox1.SelectedValue zwróci tekst aktualnie wybranego elementu.

string value = listbox1.SelectedValue;

Jeśli powiesz Daj Mi listbox1.SelectedItem to da ci cały obiekt.

ListItem item = listbox1.SelectedItem;
string value = item.value;
 8
Author: capdragon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-07 14:21:37

Zainspirowany tym pytaniem napisałem bloga wraz z fragmentem kodu tutaj . Poniżej kilka fragmentów bloga

SelectedItem-zaznaczona pozycja pomaga powiązać rzeczywistą wartość ze źródła danych, które będzie wyświetlane. Jest to obiekt typu Type i możemy powiązać dowolny typ pochodzący z typu object z tą właściwością. Ponieważ będziemy używać wiązania MVVM dla naszych skrzynek combo w tym przypadku jest to właściwość, której możemy użyć do powiadomienia maszyny wirtualnej, że element został wybrane.

SelectedValue i SelectedValuePath - to dwie najbardziej mylące i źle zinterpretowane właściwości dla 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 pomysł na temat właściwości.

 5
Author: Vikram,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-03 06:31:24

Każda kontrola używająca kolekcji do przechowywania danych posiada właściwość SelectedValue, SelectedItem. Przykładami tych kontrolek są ListBox, Dropdown, RadioButtonList, CheckBoxList.

Aby być bardziej szczegółowym, jeśli chcesz dosłownie odzyskać 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 wartość została ustawiona wcześniej. Ale powyżej jest bardziej skuteczny sposób, aby uzyskać tekst.

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

ListBox1.SelectedValue

Źródło

 1
Author: kamalpreet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-06-18 19:36:58