在以下方面有什么区别:
所有这些依赖项属性都在Selector类中定义。我经常混淆SelectedItem
与SelectedValue
,并SelectedValue
用SelectedValuePath
。
我想知道它们之间的区别,以及我们何时使用它们,尤其是SelectedValue
和SelectedValuePath
。请通过一些简单的例子说明它们的用法。
在以下方面有什么区别:
所有这些依赖项属性都在Selector类中定义。我经常混淆SelectedItem
与SelectedValue
,并SelectedValue
用SelectedValuePath
。
我想知道它们之间的区别,以及我们何时使用它们,尤其是SelectedValue
和SelectedValuePath
。请通过一些简单的例子说明它们的用法。
Answers:
他们的名字可能有点令人困惑:)。总结如下:
的的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
属性进来。您可以指定使用类别对象的ID属性分配给使用列表绑定到的Product对象SelectedValuePath='ID'
的SelectedValue
属性,然后将该属性绑定到DataContext的属性(即Product)。
下面的示例演示了这一点。我们有一个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; }
}
最初有点令人困惑,但是希望这会使它更加清晰... :)
克里斯
在概念上回答一下:
SelectedValuePath
定义绑定到ListBox的对象的属性(按其名称)ItemsSource
将用作项目的SelectedValue
。
例如,如果你的列表框被绑定到的集合Person
的对象,其每一个具有的Name
,Age
和Gender
属性,SelectedValuePath=Name
将导致所选的值Person
的Name
属性中被返回SelectedValue
。
请注意,如果您重写了ListBox的ControlTemplate(或应用了Style)来指定应显示的属性,SelectedValuePath
则无法使用。
SelectedItem
,同时返回整个 Person
当前选定对象。
(这是MSDN的另一个示例,使用TreeView)
更新:如@Joe所指出,DisplayMemberPath属性与Selected *属性无关。其正确描述如下:
请注意,这些值与DisplayMemberPath
(在ItemsControl上定义,而不是在Selector上定义)不同,但是该属性的行为类似于SelectedValuePath
:在没有样式/模板的情况下,它标识绑定到item的对象的哪个属性应用作其属性。字符串表示形式。
SelectedItem
是一个object
。
SelectedValue
和SelectedValuePath
是string
。
例如使用ListBox:
如果您说给我listbox1.SelectedValue
,它将返回当前所选项目的文本。
string value = listbox1.SelectedValue;
如果您说给我listbox1.SelectedItem
,它将给您整个对象。
ListItem item = listbox1.SelectedItem;
string value = item.value;
每个使用Collections存储数据的控件都具有SelectedValue,SelectedItem属性。这些控件的示例是ListBox,Dropdown,RadioButtonList,CheckBoxList。
更具体地说,如果您确实要检索“选定项目的文本”,则可以编写:
ListBox1.SelectedItem.Text;
如果value之前已设置,则ListBox1也可以使用SelectedValue属性返回Text。但是上面是获取文本的更有效方法。
现在,该值对于用户而言是不可见的,但通常用于存储在数据库中。我们不插入ListBox1的Text,但是也可以插入它,但是我们曾经插入所选项目的值。为了获得价值,我们可以使用
ListBox1.SelectedValue