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.
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 obiektCategory
. 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ściID
).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ściCategoryID
obiektu Produktu. Tutaj pojawiają się właściwościSelectedValuePath
iSelectedValue
. 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ążeSelectedValue
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
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.
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.
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 SelectedValuePath
są string
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;
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.
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
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