Разница между SelectedItem, SelectedValue и SelectedValuePath
В чем разница между следующим:
Все эти свойства зависимостей определены в классе Selector. Я часто путаю SelectedItem
с SelectedValue
и SelectedValue
с помощью SelectedValuePath
.
Я хотел бы знать разницу между ними, а также когда мы их используем, особенно SelectedValue
и SelectedValuePath
. Пожалуйста, объясните их использование несколькими простыми примерами.
Ответы
Ответ 1
Их имена могут быть немного запутанными :). Вот краткое изложение:
Свойство 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 объекта Object должно быть присвоено свойству объекта Product, с которым список связан с использованием SelectedValuePath='ID'
, а затем связывается свойство SelectedValue
для свойства в DataContext (т.е. в Product).
Пример ниже демонстрирует это. У нас есть ComboBox, связанный со списком категорий (через ItemsSource). Мы привязываем свойство CategoryID к Продукту как выбранное значение (используя свойство SelectedValue). Мы связываем это со свойством Category ID через свойство 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; }
}
Поначалу это немного сбивает с толку, но, надеюсь, это немного проясняет... :)
Крис
Ответ 2
Чтобы ответить немного более концептуально:
SelectedValuePath
определяет, какое свойство (по его названию) объектов, связанных с ListBox ItemsSource
, будет использоваться как элемент SelectedValue
.
Например, если ваш ListBox связан с набором объектов Person
, каждый из которых имеет свойства Name
, Age
и Gender
, SelectedValuePath=Name
приведет к значению выбранного Person
Name
, которое должно быть возвращено в SelectedValue
.
Обратите внимание, что если вы переопределите ListBox ControlTemplate (или примените стиль), который указывает, какое свойство должно отображаться, SelectedValuePath
не может использоваться.
SelectedItem
, тем временем, возвращает весь выбранный объект Person
.
(Здесь еще один пример из MSDN, используя TreeView)
Обновление: Как указывал @Joe, свойство DisplayMemberPath не связано с выбранными * свойствами. Его правильное описание следует:
Обратите внимание, что эти значения отличаются от DisplayMemberPath
(который определен в ItemsControl, а не Selector), но это свойство имеет аналогичное поведение с SelectedValuePath
: при отсутствии стиля/шаблона оно идентифицирует, какое свойство объект, связанный с элементом, должен использоваться как его строковое представление.
Ответ 3
SelectedItem
является object
.
SelectedValue
и SelectedValuePath
являются string
s.
например, используя ListBox:
если вы скажете, дайте мне listbox1.SelectedValue
, он вернет текст выбранного элемента.
string value = listbox1.SelectedValue;
если вы скажете, дайте мне listbox1.SelectedItem
, он даст вам весь объект.
ListItem item = listbox1.SelectedItem;
string value = item.value;
Ответ 4
Вдохновленный этим вопросом, я написал блог вместе с фрагментом кода здесь. Ниже приведены некоторые выдержки из блога.
SelectedItem - Выбранный элемент помогает связать фактическое значение из источника данных, который будет отображаться. Это объект типа, и мы можем связать с этим свойством любой тип, производный от типа объекта. Поскольку в этом случае мы будем использовать привязку MVVM для наших полей со списком, это свойство, которое мы можем использовать, чтобы уведомить ВМ о том, что элемент выбран.
SelectedValue и SelectedValuePath - это два наиболее запутанных и неверно истолкованных свойства для выпадающего списка. Но эти свойства приходят на помощь, когда мы хотим связать наш комбинированный список со значением из уже созданного объекта. Пожалуйста, проверьте мой последний сценарий в следующем списке, чтобы получить краткое представление о свойствах.
Ответ 5
Каждый элемент управления, который использует Коллекции для хранения данных, имеет свойство SelectedValue, SelectedItem. Примерами этих элементов управления являются ListBox, Dropdown, RadioButtonList, CheckBoxList.
Если быть более точным, если вы в буквальном смысле хотите получить текст выбранного элемента, вы можете написать:
ListBox1.SelectedItem.Text;
Ваш ListBox1 также может возвращать текст, используя свойство SelectedValue, если значение было установлено в это ранее. Но выше, это более эффективный способ получить текст.
Теперь это значение невидимо для пользователя, но используется в основном для хранения в базе данных. Мы не вставляем текст ListBox1, однако мы можем также вставить его, но мы использовали для вставки значения выбранного элемента. Чтобы получить значение мы можем использовать
ListBox1.SelectedValue
Источник