Разница между SelectedItem, SelectedValue и SelectedValuePath - PullRequest
325 голосов
/ 04 февраля 2011

Какая разница между следующим:

Все эти свойства зависимостей определены в Selector классе.Я часто путаю SelectedItem с SelectedValue и SelectedValue с SelectedValuePath.

Я хотел бы знать разницу между ними, а также когда мы их используем, особенно SelectedValue и SelectedValuePath.Пожалуйста, объясните их использование с несколькими простыми примерами.

Ответы [ 5 ]

512 голосов
/ 04 февраля 2011

Их имена могут быть немного запутанными :).Вот сводка:

  • Свойство SelectedItem возвращает весь объект, с которым связан ваш список.Допустим, вы связали список с коллекцией Category объектов (каждый объект Category имеет свойства Name и ID).например.ObservableCollection<Category>.Свойство SelectedItem вернет вам выбранный в данный момент объект Category.Однако для целей связывания это не всегда то, что вам нужно, поскольку это позволяет вам связать только объект Category со свойством, с которым связан список, а не со значением одного свойства в этом объекте Category (например, его ID свойство).

  • Поэтому у нас есть свойство SelectedValuePath и свойство SelectedValue в качестве альтернативного средства привязки (вы используете их всоединение друг с другом).Допустим, у вас есть объект Product, с которым связано ваше представление (со свойствами для таких вещей, как ProductName, Weight и т. Д.).Предположим также, что у вас есть свойство CategoryID для этого объекта Product, и вы хотите, чтобы пользователь мог выбрать категорию для продукта из списка категорий.Необходимо, чтобы свойство ID объекта Category было присвоено свойству CategoryID объекта Product.Здесь вступают свойства SelectedValuePath и SelectedValue. Вы указываете, что свойство ID объекта Category должно быть присвоено свойству объекта Product, с которым список связан с помощью SelectedValuePath='ID', а затем связываетсясвойство SelectedValue для свойства в DataContext (т. е. Product).

Пример ниже демонстрирует это.У нас есть ComboBox, связанный со списком категорий (через ItemsSource).Мы привязываем свойство CategoryID к Продукту как выбранное значение (используя свойство SelectedValue).Мы связываем это со свойством ID категории через свойство SelectedValuePath.И мы говорим только об отображении свойства Name в ComboBox со свойством DisplayMemberPath).

<ComboBox ItemsSource="{Binding Categories}" 
          SelectedValue="{Binding CategoryID, Mode=TwoWay}" 
          SelectedValuePath="ID" 
          DisplayMemberPath="Name" />

Сначала это немного сбивает с толку, но, надеюсь, это делает его немного понятнее ...:)

Крис

65 голосов
/ 04 февраля 2011

Чтобы ответить немного более концептуально:

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

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

Обратите внимание, что если вы переопределите ControlTemplate ListBox (или примените стиль), который определяет, какое свойство должно отображаться, SelectedValuePath использовать нельзя.

SelectedItem, тем временем, возвращает весь Person объект, выбранный в данный момент.

(Вот еще один пример из MSDN с использованием TreeView)

Обновление: Как указывало @Joe, свойство DisplayMemberPath не связано со свойствами Selected *. Правильное описание: 1036 *

Обратите внимание, что эти значения отличаются от DisplayMemberPath (который определяется в ItemsControl, а не Selector), но это свойство имеет поведение, аналогичное SelectedValuePath: в отсутствие стиля / шаблона оно определяет, какое свойство объект, связанный с элементом, должен использоваться как его строковое представление.

8 голосов
/ 04 февраля 2011

SelectedItem является object.SelectedValue и SelectedValuePath - это string с.

, например, с использованием ListBox:

, если вы дадите мне listbox1.SelectedValue, он вернет текст текущего выбранного элемента.

string value = listbox1.SelectedValue;

Если вы скажете, дайте мне listbox1.SelectedItem, это даст вам весь объект.

ListItem item = listbox1.SelectedItem;
string value = item.value;
5 голосов
/ 03 августа 2015

Вдохновленный этим вопросом, я написал блог вместе с фрагментом кода здесь . Ниже приведены некоторые выдержки из блога

SelectedItem - Выбранный элемент помогает привязать фактическое значение из источника данных, который будет отображаться. Это объект типа, и мы можем связать с этим свойством любой тип, производный от типа объекта. Поскольку в этом случае мы будем использовать привязку MVVM для наших полей со списком, это свойство, которое мы можем использовать для уведомления ВМ о том, что элемент выбран.

SelectedValue и SelectedValuePath - это два наиболее запутанных и неверно истолкованных свойства для выпадающего списка. Но эти свойства приходят на помощь, когда мы хотим связать наш комбинированный список со значением из уже созданного объекта. Пожалуйста, проверьте мой последний сценарий в следующем списке, чтобы получить краткое представление о свойствах.

1 голос
/ 13 марта 2014

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

Если быть более точным, если вы хотите получить текст выбранного элемента, вы можете написать:

ListBox1.SelectedItem.Text;

Ваш ListBox1 также может возвращать текст, используя свойство SelectedValue, если значение было установлено в ранее. Но выше приведен более эффективный способ получения текста.

Теперь значение - это то, что невидимо для пользователя, но используется в основном для хранения в базе данных. Мы не вставляем текст ListBox1, однако мы можем также вставить его, но мы использовали для вставки значения выбранного элемента. Чтобы получить значение, мы можем использовать

ListBox1.SelectedValue

Источник

...