Разница между 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
являются string
s.
например, используя 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