SelectedItem,SelectedValue和SelectedValuePath之间的差异

以下几点有什么区别:

  • 的SelectedItem
  • 的SelectedValue
  • SelectedValuePath

所有这些依赖属性都是在Selector类中定义的。 我经常混淆SelectedItemSelectedValueSelectedValueSelectedValuePath

我想知道它们之间的区别,也是什么时候使用它们,特别是SelectedValueSelectedValuePath 。 请用一些简单的例子来解释它们的用法

他们的名字可以有点混乱:)。 这里有一个总结:

  • SelectedItem属性返回列表绑定的整个对象。 所以说你已经绑定了一个列表到Category对象的集合(每个Category对象都有Name和ID属性)。 例如。 ObservableCollection<Category>SelectedItem属性将返回当前选定的Category对象。 但是,出于绑定的目的,这并不总是您想要的,因为这只能让您将整个Category对象绑定到列表绑定的属性,而不是该Category对象上的单个属性的值(例如其ID属性)。

  • 因此,我们将SelectedValuePath属性和SelectedValue属性作为绑定的替代方法(将它们相互结合使用)。 比方说,你有一个Product对象,你的视图是绑定的(具有诸如ProductName,Weight之类的属性)。 我们还要说,您在该Product对象上有一个CategoryID属性,并且希望用户能够从类别列表中为产品select一个类别。 您需要将Category对象的ID属性分配给Product对象上的CategoryID属性。 这就是SelectedValuePathSelectedValue属性的来源。您可以指定Category对象上的ID属性应该分配给Product对象上使用SelectedValuePath='ID'绑定到的属性,然后绑定SelectedValue属性DataContext(即产品)上的属性。

下面的例子演示了这一点。 我们有一个绑定到类别列表的combobox(通过ItemsSource)。 我们将产品上的CategoryID属性绑定为选定的值(使用SelectedValue属性)。 我们通过SelectedValuePath属性将这个关联到Category的ID属性。 而且我们只是说在ComboBox中只用DisplayMemberPath属性显示Name属性)。

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

最初有点令人困惑,但希望这可以让它更清晰一些。:)

克里斯

从概念上回答一下:

SelectedValuePath定义绑定到ListBox的ItemsSource的对象的属性(通过其名称)将用作项目的SelectedValue

例如,如果您的ListBox绑定到Person对象的集合,其中每个对象都具有NameAgeGender属性,则SelectedValuePath=Name将导致所选PersonName属性的值在SelectedValue返回。

请注意,如果您重写ListBox的ControlTemplate(或应用样式)指定什么属性应显示SelectedValuePath不能使用。

与此同时, SelectedItem返回当前选中的整个Person对象。

(这里是MSDN的另一个例子 ,使用TreeView)

更新:正如@Joe指出的那样,DisplayMemberPath属性与Selected *属性无关。 其适当的描述如下:

请注意,这些值不同于DisplayMemberPath (在ItemsControl上定义,而不是Selector),但该属性与SelectedValuePath具有相似的行为:如果没有样式/模板,它会标识绑定到项目的对象的哪个属性应该使用作为其string表示。

SelectedItem是一个objectSelectedValueSelectedValuePathstring

例如使用ListBox:

如果你说给我listbox1.SelectedValue它将返回当前select的项目的文本。

 string value = listbox1.SelectedValue; 

如果你说给我listbox1.SelectedItem它会给你整个对象。

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

受这个问题的启发,我在这里写了一个博客和代码片断 。 下面是一些博客的摘录

SelectedItem – Selected Item帮助绑定将显示的DataSource的实际值。 这是对象types,我们可以绑定任何派生自对象types的types与这个属性。 因为在这种情况下,我们将使用MVVM绑定为我们的combobox,这是我们可以用来通知VM该项目已被选中的属性。

SelectedValue和SelectedValuePath – 这是ComboBox的两个最容易混淆和曲解的属性。 但是,当我们想要将我们的combobox与已经创build的对象的值绑定在一起时,这些属性就会解救出来。 请在下面的列表中查看我的最后一个场景,以获取有关这些属性的简要说明。

每个使用集合来存储数据的控件都有SelectedValue,SelectedItem属性。 这些控件的例子是ListBox,Dropdown,RadioBuutonList,CheckBoxList。

更具体地说,如果你真的想要检索选定项目的文本,那么你可以写 –

 ListBox1.SelectedItem.Text; 

您的ListBox1也可以使用SelectedValue属性返回文本iff值已设置为之前。 但以上是更有效的方式来获取文本。

现在,值是用户不可见的东西,但它主要用于存储在数据库中。 我们不插入文本的ListBox1,但是我们也可以插入它,但我们用来插入选定项目的值。 为了获得价值,我们可以使用

 ListBox1.SelectedValue