以下有什么区别:
所有这些依赖属性都在Selector类中定义。我经常SelectedItem
与SelectedValue
和SelectedValue
混淆SelectedValuePath
。
我想知道它们之间的区别,以及我们什么时候使用它们,尤其是SelectedValue
and SelectedValuePath
。请用一些简单的例子解释它们的用途。
以下有什么区别:
所有这些依赖属性都在Selector类中定义。我经常SelectedItem
与SelectedValue
和SelectedValue
混淆SelectedValuePath
。
我想知道它们之间的区别,以及我们什么时候使用它们,尤其是SelectedValue
and SelectedValuePath
。请用一些简单的例子解释它们的用途。
他们的名字可能有点令人困惑:)。这是一个摘要:
SelectedItem属性返回列表绑定到的整个对象。因此,假设您已将列表绑定到Category
对象集合(每个 Category 对象具有 Name 和 ID 属性)。例如。ObservableCollection<Category>
. 该SelectedItem
属性将返回您当前选择的Category
对象。但是,出于绑定目的,这并不总是您想要的,因为这仅使您能够将整个 Category 对象绑定到列表绑定到的属性,而不是该 Category 对象上单个属性的值(例如它的ID
属性)。
因此,我们将SelectedValuePath属性和SelectedValue属性作为另一种绑定方式(您可以将它们结合使用)。假设您有一个Product
对象,您的视图绑定到该对象(具有诸如 ProductName、Weight 等的属性)。假设您CategoryID
在该 Product 对象上有一个属性,并且您希望用户能够从类别列表中选择产品的类别。您需要将 Category 对象的 ID 属性分配给CategoryID
Product 对象的属性。这是SelectedValuePath
和SelectedValue
properties 进来。您指定 Category 对象上的 ID 属性应分配给 List 绑定到的 Product 对象上的属性 using SelectedValuePath='ID'
,然后将该SelectedValue
属性绑定到 DataContext 上的属性(即 Product )。
下面的示例演示了这一点。我们有一个绑定到类别列表的组合框(通过 ItemsSource)。我们将 Product 上的 CategoryID 属性绑定为选定值(使用 SelectedValue 属性)。我们通过 SelectedValuePath 属性将此与类别的 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; }
}
最初有点令人困惑,但希望这会让它更清晰...... :)
克里斯
从概念上回答一点:
SelectedValuePath
定义绑定到 ListBox 的对象的哪个属性(按其名称)ItemsSource
将用作项目的SelectedValue
.
例如,如果您的 ListBox 绑定到一个Person
对象集合,每个对象都具有Name
、Age
和Gender
属性,SelectedValuePath=Name
则将导致 selectedPerson
的Name
属性值在 中返回SelectedValue
。
请注意,如果您覆盖指定应显示的属性的 ListBox 的 ControlTemplate(或应用样式),SelectedValuePath
则无法使用。
SelectedItem
同时,返回Person
当前选中的整个对象。
(这是MSDN 的另一个示例,使用 TreeView)
更新:正如@Joe 指出的, DisplayMemberPath 属性与 Selected* 属性无关。其正确描述如下:
请注意,这些值与DisplayMemberPath
(在 ItemsControl 上定义,而不是在 Selector 上定义)不同,但该属性具有与以下类似的行为SelectedValuePath
:在没有样式/模板的情况下,它标识绑定到项目的对象的哪个属性应该用作其字符串表示。
SelectedItem
是一个object
。
SelectedValue
并且SelectedValuePath
是string
s。
例如使用列表框:
如果您说给我listbox1.SelectedValue
,它将返回当前所选项目的文本。
string value = listbox1.SelectedValue;
如果你说给我listbox1.SelectedItem
,它会给你整个对象。
ListItem item = listbox1.SelectedItem;
string value = item.value;
受这个问题的启发,我写了一个博客以及这里的代码片段。以下是博客的部分摘录
SelectedItem – Selected Item 有助于绑定将显示的 DataSource 中的实际值。这是对象类型,我们可以将任何从对象类型派生的类型与此属性绑定。由于我们将在这种情况下为我们的组合框使用 MVVM 绑定,因此我们可以使用该属性来通知 VM 已选择该项目。
SelectedValue 和 SelectedValuePath – 这是组合框最容易混淆和误解的两个属性。但是,当我们想将组合框与已创建对象的值绑定时,这些属性就会派上用场。请检查我在以下列表中的最后一个场景,以简要了解这些属性。
每个使用集合存储数据的控件都具有 SelectedValue、SelectedItem 属性。这些控件的示例是 ListBox、Dropdown、RadioButtonList、CheckBoxList。
更具体地说,如果您真的想检索所选项目的文本,那么您可以编写:
ListBox1.SelectedItem.Text;
如果 value 之前已设置为,您的 ListBox1 也可以使用 SelectedValue 属性返回 Text。但以上是获取文本的更有效方法。
现在,该值对用户来说是不可见的,但它主要用于存储在数据库中。我们不插入 ListBox1 的文本,但我们也可以插入它,但我们习惯于插入所选项目的值。为了获得价值,我们可以使用
ListBox1.SelectedValue