SelectedItem,SelectedValue和SelectedValuePath之间的区别

Naw*_*waz 335 silverlight wpf xaml selectedvalue selecteditem

以下是有什么区别的:

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

我想知道它们之间的区别,并且当我们使用它们,尤其是SelectedValueSelectedValuePath.请用一些简单的例子解释它们的用法.

Chr*_*son 526

他们的名字可能有点令人困惑:).这是一个总结:

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

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

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

<ComboBox ItemsSource="{Binding Categories}" 
          SelectedValue="{Binding CategoryID, Mode=TwoWay}" 
          SelectedValuePath="ID" 
          DisplayMemberPath="Name" />
Run Code Online (Sandbox Code Playgroud)

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

克里斯

  • 是的,那是我:).我在这些部分闲逛,尽可能回答问题.很高兴你喜欢这本书:).由于您已获得该书,因此您可以在第69-70页和第204页找到有关此主题的更多信息. (21认同)
  • +1.+100.先生,你是小男人中的金色神.愿上帝保佑你,以及所有在你里面航行的人.:)说真的,我只花了两个小时试图解决这个问题 - 谢谢! (8认同)
  • 感谢您的解释.你是同一个在Silverlight上写过书的人吗?我不相信我在跟你说话.: - )......我现在正在读这本书.真的是一个很棒的工作.:-) (7认同)
  • @Lucifer:在这种情况下,您将使用SelectedItem属性,如下所示:<ComboBox ItemsSource ="{Binding Categories}"SelectedItem ="{Binding Category,Mode = TwoWay}"/>希望这会有所帮助. (2认同)
  • 我很欣赏这个答案所付出的努力,但说实话,读完它后我几乎和以前一样困惑。IMO,[另一个SO答案](/sf/ask/265792411/)更加清晰。 (2认同)

Dan*_*n J 65

从概念上回答一下:

SelectedValuePath定义绑定到ListBox的对象的哪个属性(通过其名称)ItemsSource将用作项目SelectedValue.

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

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

SelectedItem同时,返回Person当前选中的整个对象.

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

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

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


cap*_*gon 9

SelectedItem是一个object. SelectedValue并且SelectedValuePathstring.

例如使用ListBox:

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

string value = listbox1.SelectedValue;
Run Code Online (Sandbox Code Playgroud)

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

ListItem item = listbox1.SelectedItem;
string value = item.value;
Run Code Online (Sandbox Code Playgroud)

  • **`SelectedValue`** 也是一个 `object` 而不是 `string`。请参阅[此处](https://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.selector.selectedvalue(v=vs.110).aspx) (3认同)

Vik*_*ram 5

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

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

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