与以下内容有什么区别:
所有这些依赖项属性都在Selector类中定义。 我经常将SelectedItem
与SelectedValue
以及SelectedValue
与SelectedValuePath
混淆。
我想知道它们之间的区别,以及我们何时使用它们,尤其是SelectedValue
和SelectedValuePath
。 请通过一些简单的例子说明它们的用法 。
#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
是一个object
。 SelectedValue
和SelectedValuePath
是string
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
对象的集合(每个对象具有Name
, Age
和Gender
属性),则SelectedValuePath=Name
将导致在SelectedValue
返回所选Person
的Name
属性的值。
请注意,如果您重写了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
属性。 这是SelectedValuePath
和SelectedValue
属性的来源。您可以使用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; }
}
最初有点令人困惑,但是希望这会使它更加清晰... :)
克里斯
来源:oschina
链接:https://my.oschina.net/u/3797416/blog/3190449