SelectedItem,SelectedValue和SelectedValuePath之间的区别

那年仲夏 提交于 2020-03-09 14:14:24

与以下内容有什么区别:

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

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


#1楼

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

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

ListBox1.SelectedItem.Text;

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

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

ListBox1.SelectedValue

资源


#2楼

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

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

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


#3楼

SelectedItem是一个objectSelectedValueSelectedValuePathstring s。

例如使用ListBox:

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

string value = listbox1.SelectedValue;

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

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

#4楼

在概念上进行更多回答:

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

例如,如果您的ListBox绑定到Person对象的集合(每个对象具有NameAgeGender属性),则SelectedValuePath=Name将导致在SelectedValue返回所选PersonName属性的值。

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

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

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

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

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


#5楼

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

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

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

下面的示例演示了这一点。 我们有一个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; }
}

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

克里斯

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!