Разница между 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

Источник