"SelectedItem"、"SelectedValue"和"SelectedValuePath"之间的区别
"SelectedItem"、"SelectedValue"和"SelectedValuePath"之间的区别
以下三个有什么不同:
这些依赖属性都在Selector类中定义。我经常混淆SelectedItem
和SelectedValue
,以及SelectedValue
和SelectedValuePath
。
我想知道它们之间的区别,以及我们什么时候使用它们,尤其是SelectedValue
和SelectedValuePath
。请用一些简单的示例来解释它们的用途。
更加概念性地回答一下:
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
的行为:在没有样式/模板的情况下,它标识应该用作其字符串表示形式的项所绑定的对象的哪个属性。
它们的名称可能会有点令人困惑 :). 这里是一个摘要:
-
SelectedItem属性返回绑定的整个对象。所以说,您已经将一个列表绑定到一个包含Name和ID属性的
Category
对象集合上(例如ObservableCollection
)。选定的SelectedItem
属性会返回当前选定的Category
对象。但是,出于绑定目的,并不总是需要这样做,因为这仅使您能够将整个Category对象绑定到列表绑定的属性,而不是绑定到该Category对象的单个属性(例如它的ID
属性)。 -
因此,我们有
SelectedValuePath
属性和SelectedValue
属性作为另一种绑定方式(您在一起使用它们)。假设您有一个Product
对象,您的视图是绑定到该对象的(有关产品名称、重量等属性)。假设该Product对象有一个CategoryID
属性,您希望用户从类别列表中选择该产品的类别。您需要将Category对象的ID属性分配给Product对象上的CategoryID
属性。这就是SelectedValuePath
属性和SelectedValue
属性发挥作用的地方。您指定要将Category对象上的ID属性分配给Product对象上绑定到列表的属性,使用SelectedValuePath='ID'
,然后将SelectedValue
属性绑定到DataContext(即Product)上的属性。
下面的示例演示了这一点。我们将ComboBox绑定到Category列表(通过ItemsSource)。我们将Product的CategoryID属性绑定为选定的值(使用SelectedValue属性)。我们将其与Category的ID属性关联,通过SelectedValuePath属性。我们还使用DisplayMemberPath属性指定只在ComboBox中显示Name属性。
public class Category { public int ID { get; set; } public string Name { get; set; } } public class Product { public int CategoryID { get; set; } }
一开始可能有点混淆,但希望这能让事情变得更加清晰... 🙂
Chris