Разница между SelectedItem, SelectedValue и SelectedValuePath

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

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

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

5 ответов

Решение

Их имена могут быть немного запутанными:). Вот резюме:

  • Свойство 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 (т. е. Продукт).

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

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

Поначалу это немного смущает, но, надеюсь, это немного проясняет...:)

Крис

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

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

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

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

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

(Вот еще один пример из MSDN, использующий TreeView)

Обновление: как указал @Joe, свойство DisplayMemberPath не связано со свойствами Selected*. Его правильное описание следующее:

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

SelectedItem является object,SelectedValue а также SelectedValuePath являются strings.

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

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

string value = listbox1.SelectedValue;

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

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

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

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

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

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

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

ListBox1.SelectedItem.Text;

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

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

ListBox1.SelectedValue
Другие вопросы по тегам