以下内容之间有什么区别:
所有这些依赖项属性都在Selector类中定义。我经常将SelectedItem
与SelectedValue
混为一谈,SelectedValue
与SelectedValuePath
混淆。
我想知道它们之间的区别,以及我们何时使用它们,尤其是SelectedValue
和SelectedValuePath
。请用一些简单的例子解释他们的使用。
答案 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
属性。这是CategoryID
和SelectedValuePath
属性的来源。您指定应将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
个对象的集合,每个对象都有Name
,Age
和Gender
属性,{{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)
SelectedItem
是object
。
SelectedValue
和SelectedValuePath
是string
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