SelectedItem,SelectedValue和SelectedValuePath之间的差异
以下几点有什么区别:
- 的SelectedItem
- 的SelectedValue
- SelectedValuePath
所有这些依赖属性都是在Selector类中定义的。 我经常混淆SelectedItem
与SelectedValue
和SelectedValue
与SelectedValuePath
。
我想知道它们之间的区别,也是什么时候使用它们,特别是SelectedValue
和SelectedValuePath
。 请用一些简单的例子来解释它们的用法 。
他们的名字可以有点混乱:)。 这里有一个总结:
-
SelectedItem属性返回列表绑定的整个对象。 所以说你已经绑定了一个列表到
Category
对象的集合(每个Category对象都有Name和ID属性)。 例如。ObservableCollection<Category>
。SelectedItem
属性将返回当前选定的Category
对象。 但是,出于绑定的目的,这并不总是您想要的,因为这只能让您将整个Category对象绑定到列表绑定的属性,而不是该Category对象上的单个属性的值(例如其ID
属性)。 -
因此,我们将SelectedValuePath属性和SelectedValue属性作为绑定的替代方法(将它们相互结合使用)。 比方说,你有一个
Product
对象,你的视图是绑定的(具有诸如ProductName,Weight之类的属性)。 我们还要说,您在该Product对象上有一个CategoryID
属性,并且希望用户能够从类别列表中为产品select一个类别。 您需要将Category对象的ID属性分配给Product对象上的CategoryID
属性。 这就是SelectedValuePath
和SelectedValue
属性的来源。您可以指定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
对象的集合,其中每个对象都具有Name
, Age
和Gender
属性,则SelectedValuePath=Name
将导致所选Person
的Name
属性的值在SelectedValue
返回。
请注意,如果您重写ListBox的ControlTemplate(或应用样式)指定什么属性应显示SelectedValuePath
不能使用。
与此同时, SelectedItem
返回当前选中的整个Person
对象。
(这里是MSDN的另一个例子 ,使用TreeView)
更新:正如@Joe指出的那样,DisplayMemberPath属性与Selected *属性无关。 其适当的描述如下:
请注意,这些值不同于DisplayMemberPath
(在ItemsControl上定义,而不是Selector),但该属性与SelectedValuePath
具有相似的行为:如果没有样式/模板,它会标识绑定到项目的对象的哪个属性应该使用作为其string表示。
SelectedItem
是一个object
。 SelectedValue
和SelectedValuePath
是string
。
例如使用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