SelectedItem, SelectedValue和SelectedValuePath之间的差异

以下两者的区别是什么:

  • < a href = " http://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.selector.selecteditem.aspx " >设置SelectedItem < / >
  • < a href = " http://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.selector.selectedvalue.aspx " > SelectedValue < / >
  • < a href = " http://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.selector.selectedvaluepath.aspx " > SelectedValuePath < / >

所有这些依赖属性都在选择器类中定义。我经常混淆SelectedItemSelectedValue,以及SelectedValueSelectedValuePath

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

275218 次浏览

SelectedItemSelectedValue是一个object。 和SelectedValuePath是一个string.

例如使用ListBox:

listbox1.SelectedValue以下变成一个字符串值。

string value = listbox1.SelectedValue;

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

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

更概念化地回答:

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

例如,如果你的ListBox绑定到一个Person对象的集合,每个对象都有NameAgeGender属性,SelectedValuePath=Name将导致所选PersonName属性的值在SelectedValue中返回。

注意,如果你重写ListBox的ControlTemplate(或应用一个Style)来指定应该显示什么属性,SelectedValuePath就不能被使用。

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

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

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

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

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

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

  • 因此,我们有SelectedValuePath属性和SelectedValue属性作为另一种绑定方式(您可以将它们结合使用)。假设你有一个Product对象,你的视图被绑定到它(带有诸如ProductName, Weight等属性)。再假设在Product对象上有CategoryID属性,并且希望用户能够从类别列表中为产品选择一个类别。你需要将Category对象的ID属性赋值给Product对象的CategoryID属性。这就是SelectedValuePathSelectedValue属性的用武之地。你指定Category对象上的ID属性应该被分配给Product对象上的属性,列表使用SelectedValuePath='ID'绑定到这个对象上,然后将SelectedValue属性绑定到DataContext上的属性(例如。产品)。

下面的示例演示了这一点。我们有一个组合框绑定到一个类别列表(通过ItemsSource)。我们将产品上的CategoryID属性绑定为所选值(使用SelectedValue属性)。我们通过SelectedValuePath属性将其关联到Category的ID属性。我们说只在组合框中显示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; }
}

刚开始有点混乱,但希望这能让你更清楚……:)

克里斯

每个使用集合存储数据的控件都有SelectedValue、SelectedItem属性。这些控件的例子有ListBox, Dropdown, RadioButtonList, CheckBoxList。

更具体地说,如果你字面上想检索所选项目的文本,那么你可以这样写:

ListBox1.SelectedItem.Text;

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

现在,值对用户是不可见的,但它主要用于存储在数据库中。我们没有插入ListBox1的文本,但是我们也可以插入它,但是我们用来插入所选项目的值。以获得我们可以使用的价值

ListBox1.SelectedValue

Source .

受到这个问题的启发,我和代码片段如下一起写了一篇博客。以下是该博客的部分节选

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

SelectedValue和SelectedValuePath——这是组合框中最令人困惑和误解的两个属性。但是当我们想要将组合框与已经创建的对象的值绑定时,这些属性就会派上用场。请查看下面列表中的最后一个场景,以获得关于属性的简要概念。