SelectedItem,SelectedValue和SelectedValuePath之间的区别

时间:2011-02-04 19:22:22

标签: wpf silverlight xaml selecteditem selectedvalue

以下内容之间有什么区别:

所有这些依赖项属性都在Selector类中定义。我经常将SelectedItemSelectedValue混为一谈,SelectedValueSelectedValuePath混淆。

我想知道它们之间的区别,以及我们何时使用它们,尤其是SelectedValueSelectedValuePath。请用一些简单的例子解释他们的使用

5 个答案:

答案 0 :(得分:502)

他们的名字可能有点令人困惑:)。以下是摘要:

  • SelectedItem 属性返回列表绑定的整个对象。因此,假设您已将列表绑定到Category个对象的集合(每个Category对象都具有Name和ID属性)。例如。 ObservableCollection<Category>SelectedItem属性将返回当前选定的Category对象。但是,出于绑定目的,这并不总是您想要的,因为这只能使您将整个Category对象绑定到列表绑定的属性,而不是该Category对象上的单个属性的值(例如它的{ {1}}属性)。

  • 因此,我们将 SelectedValuePath 属性和 SelectedValue 属性作为替代绑定方式(您将它们彼此结合使用)。假设您有一个ID对象,您的视图必须绑定(使用ProductName,Weight等属性)。我们还假设您在该Product对象上有Product属性,并且您希望用户能够从类别列表中选择产品的类别。您需要将Category对象的ID属性分配给Product对象上的CategoryID属性。这是CategoryIDSelectedValuePath属性的来源。您指定应将Category对象上的ID属性分配给列表绑定到的Product对象上的属性{{1然后将SelectedValue属性绑定到DataContext上的属性(即产品)。

以下示例说明了这一点。我们有一个ComboBox绑定到Categories列表(通​​过ItemsSource)。我们将Product上的CategoryID属性绑定为选定值(使用SelectedValue属性)。我们通过SelectedValuePath属性将其与Category的ID属性相关联。我们只是说使用DisplayMemberPath属性在ComboBox中显示Name属性。

SelectedValuePath='ID'

最初有点令人困惑,但希望这会让它更清晰......:)

克里斯

答案 1 :(得分:63)

从概念上回答一下:

SelectedValuePath定义绑定到ListBox的ItemsSource的对象的哪个属性(按名称)将用作项SelectedValue

例如,如果您的ListBox绑定到Person个对象的集合,每个对象都有NameAgeGender属性,{{1} }将导致SelectedValuePath=Name中返回所选Person的{​​{1}}属性的值。

请注意,如果覆盖ListBox的ControlTemplate(或应用样式),指定应显示的属性,则无法使用Name

同时,

SelectedValue返回当前所选的整个SelectedValuePath对象。

(这里是a further example from MSDN,使用TreeView)

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

请注意,这些值不同于SelectedItem(在ItemsControl上定义,而不是Selector),但该属性与Person具有相似的行为:在没有样式/模板的情况下,它会识别绑定到item的对象的哪个属性应该用作其字符串表示。

答案 2 :(得分:7)

SelectedItemobjectSelectedValueSelectedValuePathstring s。

例如使用ListBox:

如果您说给我listbox1.SelectedValue,它将返回当前所选项目的文字。

string value = listbox1.SelectedValue;

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

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

答案 3 :(得分:4)

受到这个问题的启发,我和code snippet here一起写了一篇博客。以下是博客中的一些摘录

SelectedItem - Selected Item有助于绑定将要显示的DataSource的实际值。这是对象类型,我们可以使用此属性绑定从对象类型派生的任何类型。由于在这种情况下我们将为组合框使用MVVM绑定,因此我们可以使用该属性来通知VM已选择该项目。

SelectedValue和SelectedValuePath - 这是组合框的两个最令人困惑和误解的属性。但是当我们想要将我们的组合框与已创建的对象的值绑定时,这些属性就会被拯救。请查看以下列表中的最后一个场景,以便对该属性进行简要了解。

答案 4 :(得分:0)

使用Collections存储数据的每个控件都具有SelectedValue,SelectedItem属性。这些控件的示例是ListBox,Dropdown,RadioButtonList,CheckBoxList。

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

ListBox1.SelectedItem.Text;

如果value设置为之前,ListBox1也可以使用SelectedValue属性返回Text。但上面是获取文本的更有效方法。

现在,该值是用户看不到的,但主要用于存储在数据库中。我们不插入ListBox1的Text,但是我们也可以插入它,但是我们用来插入所选项的值。为了获得价值,我们可以使用

ListBox1.SelectedValue