Різниця між SelectedItem, SelectedValue та SelectedValuePath


352

У чому різниця між наступним:

Усі ці властивості залежності визначені у класі Selector . Я часто плутаю і SelectedItemз SelectedValue, і SelectedValueз SelectedValuePath.

Я хотів би знати різницю між ними, а також коли ми їх використовуємо, особливо SelectedValueі SelectedValuePath. Поясніть, будь ласка, їх використання кількома простими прикладами.


3
У Bea є повідомлення в блозі з поясненнями та зразковим кодом, який ви можете завантажити ... bea.stollnitz.com/blog/?p=9
Аарон

2
можливо дублікат [Confused з МОФ ComboBox DisplayMemberPath, SelectedValue і SelectedValuePath] ( stackoverflow.com/questions/3797034 / ... )

Відповіді:


552

Їх імена можуть бути трохи заплутаними :). Ось підсумок:

  • SelectedItem властивість повертає весь об'єкт , що ваш список прив'язаний. Тож скажіть, що ви прив’язали список до колекції Categoryоб’єктів (кожен об'єкт Категорії має властивості Ім'я та Ідентифікатор). напр. ObservableCollection<Category>. SelectedItemВластивість поверне вам поточний обраний Categoryоб'єкт. Для обов'язкових цілей це не завжди є тим, що ви хочете, оскільки це дозволяє лише прив’язати весь об’єкт Категорії до властивості, до якого пов'язаний список, а не значення окремої властивості для цього об'єкта Категорії (наприклад, його IDвластивості ).

  • Тому у нас є властивість SelectedValuePath та властивість SelectedValue як альтернативний засіб зв’язування (ви використовуєте їх у поєднанні один з одним). Скажімо, у вас є Productоб'єкт, на який поширюється ваш погляд (з властивостями для таких речей, як ProductName, Weight і т.д.) Скажімо, у вас є CategoryIDвластивість цього об’єкта Продукту, і ви хочете, щоб користувач міг вибрати категорію продукту зі списку категорій. Потрібно властивість ідентифікатора об'єкта Категорія призначити CategoryIDвластивості об’єкта Продукт. Ось тут SelectedValuePathіSelectedValueВи вказуєте, що властивість ідентифікатора на об'єкті категорії слід присвоювати властивості об’єкта Product, яким список зобов'язаний використовувати SelectedValuePath='ID', а потім прив'язувати SelectedValueвластивість до властивості в DataContext (тобто продукт).

Наведений приклад демонструє це. У нас є ComboBox, прив’язаний до списку категорій (через ItemsSource). Ми пов’язуємо властивість CategoryID у Продукті як вибране значення (використовуючи властивість SelectedValue). Ми пов’язуємо це з власністю ідентифікатора Категорії через властивість SelectedValuePath. І ми говоримо лише відображати властивість Name в ComboBox із властивістю 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; }
}

Спочатку це трохи заплутано, але, сподіваємось, це стає трохи зрозумілішим ... :)

Кріс


8
Дякую за пояснення. Ви той самий хлопець, який написав книгу на Silverlight? Я не вірю, що я з тобою розмовляю : -) ... я зараз читаю цю книгу. Дійсно дивовижна робота. :-)
Наваз

22
Так, це я :). Я розвішую ці частини тут, щоб відповісти на запитання, коли зможу. Радий, що вам подобається книга :). Оскільки ви отримали книгу, ви знайдете більше інформації з цієї теми на сторінках 69-70 та на сторінці 204.
Кріс Андерсон

8
+1. +100. Ви, пане, золотий бог серед менших людей. Нехай Бог благословить вас і всіх, хто пливе в вас. :) Серйозно, я щойно дві години намагався зрозуміти це - дякую!
TarkaDaal

1
@Chris Anderson: Що робити, якщо об’єкт Product має властивість Category (тип Category) замість CategoryID? Як я можу оновити властивість цієї категорії щодо зміни ComboBox шляхом прив'язки?
Люцифер

2
@Lucifer: У цьому випадку ви б використали властивість SelectedItem так: <ComboBox ItemsSource = "{Категорії прив'язки}" SelectedItem = "{Категорія прив'язки, режим = TwoWay}" /> Сподіваюся, що це допоможе.
Кріс Андерсон

69

Щоб відповісти трохи концептуальніше:

SelectedValuePathвизначає, яке властивість (за його назвою) об'єктів, пов'язаних з ListBox, ItemsSourceбуде використовуватися в якості елемента SelectedValue.

Наприклад, якщо ваш ListBox прив'язаний до колекції Personоб'єктів, кожен з яких має Name, Ageі Genderвластивості, SelectedValuePath=Nameвикликає значення обраного Person«s Nameмайна , яке буде повернуто в SelectedValue.

Зауважте, що якщо ви перекриєте контрольний зразок ListBox (або застосуєте стиль), який визначає, яке властивість має відображатися, SelectedValuePathне можна використовувати.

SelectedItemтим часом повертає весь Personобраний на даний момент об'єкт.

(Ось подальший приклад з MSDN , використовуючи TreeView)

Оновлення: Як зазначав @Joe, властивість DisplayMemberPath не пов'язане з властивостями вибраних *. Його правильний опис наступний:

Зауважте, що ці значення відрізняються від DisplayMemberPath(що визначено у ItemControl, а не у Selector), але це властивість має аналогічну поведінку SelectedValuePath: у разі відсутності стилю / шаблону воно визначає, яке властивість об'єкта, пов'язаного з елементом, має використовуватися як його представлення рядків


8

SelectedItemє object. SelectedValueі SelectedValuePathє stringс.

наприклад, використовуючи ListBox:

якщо ви скажете, дайте мені, listbox1.SelectedValueвін поверне текст поточно вибраного елемента.

string value = listbox1.SelectedValue;

якщо ти скажеш, дай мені, listbox1.SelectedItemце дасть тобі весь предмет.

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

3
SelectedValueтакож є, objectа не є string. Подивіться тут
john_m

5

натхненний цим питанням, я написав блог разом із фрагментом коду . Нижче наведено кілька уривків із блогу

SelectedItem - Вибраний елемент допомагає прив’язати фактичне значення до джерела даних, який відображатиметься. Це об'єкт типу, і ми можемо зв'язати з цим властивістю будь-який тип, похідний від типу об'єкта. Оскільки в нашому випадку ми будемо використовувати прив'язку MVVM для своїх комбінованих полів, це властивість, яку ми можемо використовувати для сповіщення VM про вибраний елемент.

SelectedValue та SelectedValuePath - це два найбільш заплутаних та неправильно інтерпретованих властивостей для комбобоксу. Але ці властивості приходять на допомогу, коли ми хочемо прив’язати наш комбобокс зі значенням вже створеного об’єкта. Перевірте мій останній сценарій у наступному списку, щоб отримати коротке уявлення про властивості.


1

Кожен елемент управління, який використовує Колекції для зберігання даних, має властивість SelectedValue, SelectedItem. Прикладами цих елементів керування є ListBox, Dropdown, RadioButtonList, CheckBoxList.

Щоб бути більш конкретним, якщо ви буквально хочете отримати текст вибраного елемента, ви можете написати:

ListBox1.SelectedItem.Text;

Ваш ListBox1 також може повернути Text за допомогою властивості SelectedValue, якщо значення було встановлено раніше. Але вище є більш ефективним способом отримання тексту.

Тепер це значення - це те, що не видно користувачеві, але воно використовується в основному для зберігання в базі даних. Ми не вставляємо Text of ListBox1, однак ми можемо також вставити його, але ми ввели значення вибраного елемента. Для отримання цінності ми можемо використовувати

ListBox1.SelectedValue

Джерело

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.