在 WPF 中绑定 Combobox 的 SelectedItem。
在 WPF 中绑定 Combobox 的 SelectedItem。
以下三者之间有何不同:
这些依赖属性都定义在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属性返回整个对象,您的列表绑定到该对象。因此,假设您已将列表绑定到
Category
对象的集合(每个Category对象都具有Name和ID属性)。例如:ObservableCollection
。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(即Product)上的属性。
下面的示例演示了这一点。我们将ComboBox绑定到一组类别(通过ItemsSource),将Product的CategoryID属性作为选定值绑定(使用SelectedValue属性)。我们通过SelectedValuePath属性将它与Category的ID属性相关联。并且我们只在ComboBox中显示Name属性,使用DisplayMemberPath属性。
public class Category { public int ID { get; set; } public string Name { get; set; } } public class Product { public int CategoryID { get; set; } }
一开始可能有点令人困惑,但希望这让事情变得更清晰... 🙂
Chris