以下是有什么区别的:
SelectedItem
SelectedValue
SelectedValuePath
所有这些依赖项属性都在Selector class中定义 . 我常常将 SelectedItem 与 SelectedValue 混淆,将 SelectedValue 与 SelectedValuePath 混淆 .
我想知道它们之间的区别,以及我们何时使用它们,尤其是 SelectedValue 和 SelectedValuePath . 请用一些简单的例子解释它们的用法 .
他们的名字可能有点令人困惑:) . 这是一个总结:
SelectedItem 属性返回列表绑定的整个对象 . 因此,假设您已将列表绑定到 Category 对象的集合(每个Category对象具有Name和ID属性) . 例如 . ObservableCollection<Category> . SelectedItem 属性将返回当前选定的 Category 对象 . 但是,出于绑定目的,这并不总是您想要的,因为这只能使您将整个Category对象绑定到列表绑定的属性,而不是该Category对象上的单个属性的值(例如 ID )属性) .
Category
ObservableCollection<Category>
ID
因此,我们将 SelectedValuePath 属性和 SelectedValue 属性作为替代绑定方式(您将它们彼此结合使用) . 假设您有一个 Product 对象,您的视图被绑定(具有ProductName,Weight等属性) . 我们还假设您在该Product对象上有 CategoryID 属性,并且您希望用户能够从类别列表中选择产品的类别 . 您需要将Category对象的ID属性分配给Product对象上的 CategoryID 属性 . 这是 SelectedValuePath 和 SelectedValue 属性的来源 . 您指定应将Category对象上的ID属性分配给列表绑定到的Product对象上的属性 SelectedValuePath='ID' ,然后将 SelectedValue 属性绑定到属性在DataContext上(即产品) .
Product
CategoryID
SelectedValuePath='ID'
以下示例演示了这一点 . 我们有一个ComboBox绑定到Categories列表(通过ItemsSource) . 我们将Product上的CategoryID属性绑定为选定值(使用SelectedValue属性) . 我们通过SelectedValuePath属性将其与Category的ID属性相关联 . 我们只是说使用DisplayMemberPath属性在ComboBox中显示Name属性 .
<ComboBox ItemsSource="{Binding Categories}" SelectedValue="{Binding CategoryID, Mode=TwoWay}" SelectedValuePath="ID" DisplayMemberPath="Name" />
最初有点令人困惑,但希望这会让它更清晰...... :)
克里斯
受这个问题的启发,我和_122188一起写了一篇博客 . 以下是博客的一些摘录
SelectedItem - Selected Item有助于绑定将显示的DataSource的实际值 . 这是对象类型,我们可以使用此属性绑定从对象类型派生的任何类型 . 由于我们将在这种情况下为我们的组合框使用MVVM绑定,因此我们可以使用该属性来通知VM已选择项目 .
SelectedValue和SelectedValuePath - 这是组合框的两个最令人困惑和误解的属性 . 但是当我们想要将我们的组合框与已创建的对象的值绑定时,这些属性就会被拯救 . 请查看以下列表中的最后一个场景,以了解有关属性的简要信息 .
使用Collections存储数据的每个控件都具有SelectedValue,SelectedItem属性 . 这些控件的示例是ListBox,Dropdown,RadioButtonList,CheckBoxList .
更具体地说,如果你真的想要检索所选项的文本,那么你可以写:
ListBox1.SelectedItem.Text;
如果value设置为之前,ListBox1也可以使用SelectedValue属性返回Text . 但上面是获取文本的更有效方法 .
现在,该值是用户不可见的,但主要用于存储在数据库中 . 我们不插入ListBox1的Text,但是我们也可以插入它,但是我们用来插入所选项的值 . 为了获得 Value ,我们可以使用
ListBox1.SelectedValue
从概念上回答一下:
SelectedValuePath定义绑定到ListBox的 ItemsSource 的对象的哪个属性(按名称)将用作项目的 SelectedValue .
ItemsSource
例如,如果ListBox绑定到 Person 对象的集合,每个对象都有 Name , Age 和 Gender 属性, SelectedValuePath=Name 将导致 SelectedValue 中返回所选 Person 的 Name 属性的值 .
Person
Name
Age
Gender
SelectedValuePath=Name
请注意,如果覆盖ListBox的ControlTemplate(或应用样式),指定应显示的属性,则不能使用 SelectedValuePath .
同时, SelectedItem 返回当前选中的整个 Person 对象 .
(这是a further example from MSDN,使用TreeView)
Update: 正如@Joe指出的那样,DisplayMemberPath属性与Selected *属性无关 . 其正确描述如下:
请注意,这些值与 DisplayMemberPath (在ItemsControl上定义,而不是选择器)不同,但该属性具有类似行为 SelectedValuePath :在没有样式/模板的情况下,它标识绑定到项目的对象的哪个属性应该用作其字符串表示 .
DisplayMemberPath
SelectedItem 是 object . SelectedValue 和 SelectedValuePath 是 string s .
object
string
例如使用ListBox:
如果你说给我 listbox1.SelectedValue 它将返回当前所选项目的文本 .
listbox1.SelectedValue
string value = listbox1.SelectedValue;
如果你说给我 listbox1.SelectedItem 它会给你整个对象 .
listbox1.SelectedItem
ListItem item = listbox1.SelectedItem; string value = item.value;
5 回答
他们的名字可能有点令人困惑:) . 这是一个总结:
SelectedItem 属性返回列表绑定的整个对象 . 因此,假设您已将列表绑定到
Category
对象的集合(每个Category对象具有Name和ID属性) . 例如 .ObservableCollection<Category>
.SelectedItem
属性将返回当前选定的Category
对象 . 但是,出于绑定目的,这并不总是您想要的,因为这只能使您将整个Category对象绑定到列表绑定的属性,而不是该Category对象上的单个属性的值(例如ID
)属性) .因此,我们将 SelectedValuePath 属性和 SelectedValue 属性作为替代绑定方式(您将它们彼此结合使用) . 假设您有一个
Product
对象,您的视图被绑定(具有ProductName,Weight等属性) . 我们还假设您在该Product对象上有CategoryID
属性,并且您希望用户能够从类别列表中选择产品的类别 . 您需要将Category对象的ID属性分配给Product对象上的CategoryID
属性 . 这是SelectedValuePath
和SelectedValue
属性的来源 . 您指定应将Category对象上的ID属性分配给列表绑定到的Product对象上的属性SelectedValuePath='ID'
,然后将SelectedValue
属性绑定到属性在DataContext上(即产品) .以下示例演示了这一点 . 我们有一个ComboBox绑定到Categories列表(通过ItemsSource) . 我们将Product上的CategoryID属性绑定为选定值(使用SelectedValue属性) . 我们通过SelectedValuePath属性将其与Category的ID属性相关联 . 我们只是说使用DisplayMemberPath属性在ComboBox中显示Name属性 .
最初有点令人困惑,但希望这会让它更清晰...... :)
克里斯
受这个问题的启发,我和_122188一起写了一篇博客 . 以下是博客的一些摘录
SelectedItem - Selected Item有助于绑定将显示的DataSource的实际值 . 这是对象类型,我们可以使用此属性绑定从对象类型派生的任何类型 . 由于我们将在这种情况下为我们的组合框使用MVVM绑定,因此我们可以使用该属性来通知VM已选择项目 .
SelectedValue和SelectedValuePath - 这是组合框的两个最令人困惑和误解的属性 . 但是当我们想要将我们的组合框与已创建的对象的值绑定时,这些属性就会被拯救 . 请查看以下列表中的最后一个场景,以了解有关属性的简要信息 .
使用Collections存储数据的每个控件都具有SelectedValue,SelectedItem属性 . 这些控件的示例是ListBox,Dropdown,RadioButtonList,CheckBoxList .
更具体地说,如果你真的想要检索所选项的文本,那么你可以写:
如果value设置为之前,ListBox1也可以使用SelectedValue属性返回Text . 但上面是获取文本的更有效方法 .
现在,该值是用户不可见的,但主要用于存储在数据库中 . 我们不插入ListBox1的Text,但是我们也可以插入它,但是我们用来插入所选项的值 . 为了获得 Value ,我们可以使用
从概念上回答一下:
SelectedValuePath定义绑定到ListBox的
ItemsSource
的对象的哪个属性(按名称)将用作项目的SelectedValue
.例如,如果ListBox绑定到
Person
对象的集合,每个对象都有Name
,Age
和Gender
属性,SelectedValuePath=Name
将导致SelectedValue
中返回所选Person
的Name
属性的值 .请注意,如果覆盖ListBox的ControlTemplate(或应用样式),指定应显示的属性,则不能使用
SelectedValuePath
.同时,
SelectedItem
返回当前选中的整个Person
对象 .(这是a further example from MSDN,使用TreeView)
Update: 正如@Joe指出的那样,DisplayMemberPath属性与Selected *属性无关 . 其正确描述如下:
请注意,这些值与
DisplayMemberPath
(在ItemsControl上定义,而不是选择器)不同,但该属性具有类似行为SelectedValuePath
:在没有样式/模板的情况下,它标识绑定到项目的对象的哪个属性应该用作其字符串表示 .SelectedItem
是object
.SelectedValue
和SelectedValuePath
是string
s .例如使用ListBox:
如果你说给我
listbox1.SelectedValue
它将返回当前所选项目的文本 .如果你说给我
listbox1.SelectedItem
它会给你整个对象 .