SelectedItem,SelectedValue和SelectedValuePath之间的区别


351

在以下方面有什么区别:

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

我想知道它们之间的区别,以及我们何时使用它们,尤其是SelectedValueSelectedValuePath。请通过一些简单的例子说明它们的用法


3
Bea的博客文章带有说明和示例代码,您可以下载... bea.stollnitz.com/blog/?p=9
Aaron McIver

2
的可能重复的[与困惑WPF组合框的DisplayMemberPath,的SelectedValue和SelectedValuePath](stackoverflow.com/questions/3797034/...

Answers:


552

他们的名字可能有点令人困惑:)。总结如下:

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

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

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

<ComboBox ItemsSource="{Binding Categories}" 
          SelectedValue="{Binding CategoryID, Mode=TwoWay}" 
          SelectedValuePath="ID" 
          DisplayMemberPath="Name" />
public class Category
{
    public int ID { get; set; }
    public string Name { get; set; }
}

public class Product
{
    public int CategoryID { get; set; }
}

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

克里斯


8
感谢您的解释。您是在Silverlight上写过书的同一个人吗?我不相信我在跟你说话。:-)...我现在正在读这本书。真的很棒。:-)
Nawaz

22
是的,就是我:)。我会在这里徘徊这些部分,以便在可能时回答问题。很高兴您喜欢这本书:)。既然你已经有了这本书,你会发现对69-70页了解更多相关信息,和204页
克里斯·安德森

8
+1。+100。先生,您是小众人中的黄金神。愿上帝保佑你,以及所有在你身旁航行的人。:)认真地说,我只花了两个小时试图弄清楚这一点-谢谢!
TarkaDaal 2012年

1
@Chris Anderson:如果Product对象具有Category属性(类型Category)而不是CategoryID,该怎么办?如何通过绑定在ComboBox的更改上更新此Category属性?
路西法2014年

2
@Lucifer:在这种情况下,您将像这样使用SelectedItem属性:<ComboBox ItemsSource =“ {Binding Categories}” SelectedItem =“ {Binding Category,Mode = TwoWay}” />希望这会有所帮助。
克里斯·安德森

69

在概念上回答一下:

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

例如,如果你的列表框被绑定到的集合Person的对象,其每一个具有的NameAgeGender属性,SelectedValuePath=Name将导致所选的值PersonName属性中被返回SelectedValue

请注意,如果您重写了ListBox的ControlTemplate(或应用了Style)来指定应显示的属性,SelectedValuePath则无法使用。

SelectedItem,同时返回整个 Person当前选定对象。

(这是MSDN的另一个示例,使用TreeView)

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

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


8

SelectedItem是一个objectSelectedValueSelectedValuePathstring

例如使用ListBox:

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

string value = listbox1.SelectedValue;

如果您说给我listbox1.SelectedItem,它将给您整个对象。

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

3
SelectedValue也是一个,object而不是一个string。请在这里
john_m

5

受这个问题的启发,我在这里编写了博客和代码片段。以下是博客的一些摘录

SelectedItem – Selected Item帮助绑定将显示的数据源中的实际值。这是对象类型,我们可以使用此属性绑定从对象类型派生的任何类型。因为在这种情况下,我们将对组合框使用MVVM绑定,所以这是我们可以用来通知VM已选择项目的属性。

SelectedValue和SelectedValuePath –这是组合框两个最容易混淆和误解的属性。但是,当我们想将组合框与已经创建的对象的值绑定在一起时,这些属性将可以挽救。请检查以下列表中的最后一个方案,以简要了解这些属性。


1

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

更具体地说,如果您确实要检索“选定项目的文本”,则可以编写:

ListBox1.SelectedItem.Text;

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

现在,该值对于用户而言是不可见的,但通常用于存储在数据库中。我们不插入ListBox1的Text,但是也可以插入它,但是我们曾经插入所选项目的值。为了获得价值,我们可以使用

ListBox1.SelectedValue

资源

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.