WPF Selector、SelectIndex、SelectedValue、SelectedValuePath、SelectedItem这几兄弟你分的清楚嘛?
Selector
Selector是一个抽象类,继承ItemsControl类(包含任何类型的对象(例如字符串,图像或面板)的集合),而本文的4个兄弟都是Selector类下的4个属性。
SelectIndex
SelectIndex的作用是
获取或设置当前选择项中第一项的索引,如果选择项为空,则返回负数(-1)
大致理解成将集合像数据那样排序,index就是序号,根据序号设置获取选中项。
以下代码表示选择索引为0也就是默认选中第一项。
<ListBox Margin="10,0,0,5" SelectedIndex="0"
Name="listBox1" VerticalAlignment="Top" Grid.Column="0" Grid.Row="4">
<ListBoxItem>Item 0</ListBoxItem>
<ListBoxItem>Item 1</ListBoxItem>
<ListBoxItem>Item 2</ListBoxItem>
<ListBoxItem>Item 3</ListBoxItem>
</ListBox>
SelectedItem
SelectedItem作用是
获取或设置当前选定项目或null没有当前选定项目的对象。
注意,是整个对象!
如果数据源是Collection< Class>,那么SelectedItem就是Class 的对象。我们可以通过SelectedItem来获取对象的相关属性。
但是,如果我仅仅只需要Id一个属性,那么通过SelectedItem是不是过于浪费了呢?所以为了满足这项需求,SelectedValue和 SelectedValuePath应运而生。
SelectedValue和 SelectedValuePath
假设数据源是Collection< Class>,如果需要获取Id,我们只需要将数据源绑定后,SelectedValuePath=“id” ,SelectedValue={Binding yourProperty}即可。
有点千万注意:
SelectedValue属性是用来获取选中值的,并不是为了设置,设置就算双向绑定也是无法更改绑定控件Text的只有SelectedItem可以。
DisplayMemberPath
作用:
源对象上的值的路径。这可以是任何路径,也可以是XPath,例如“ @Name”。默认值为空字符串(“”),设置后会对应绑定数据源对应的属性名称。
通俗来说,就是设置要显示的路径,例如
<ComboBox ItemsSource="{Binding Human}"
SelectedValue="{Binding ID, Mode=TwoWay}"
SelectedValuePath="ID"
DisplayMemberPath="Name" />
DisplayMemberPath="Name,下拉框显示路径是Human.Name.
IsSynchronizedWithCurrentItem
作用:
获取或设置一个值,该值指示Selector是否应保持Items属性中当前项目与SelectedItem同步。
这个属性是bool?类型,设置是否同步当前选中项。
即如果有两个combobox设置了IsSynchronizedWithCurrentItem=“True”,当你选择其中一个,另外一个会自动变化。
<ListBox Name="employeeListBox1"
ItemsSource="{Binding Source={StaticResource Employees}}"
ItemTemplate="{StaticResource EmployeeItemTemplate}"
IsSynchronizedWithCurrentItem="True"/>
<ListBox Name="employeeListBox2"
ItemsSource="{Binding Source={StaticResource Employees}}"
ItemTemplate="{StaticResource EmployeeItemTemplate}"
IsSynchronizedWithCurrentItem="True"/>
实际运用要点:
以下是使用心得
尽量不要SelectedItem和SelectedValue一起用,会先加载SelectedItem后加载SelectedValue,如果你的SelectedValue没有指定值,它会更改SelectedItem的值为null。
双向绑定情况下,SelectIndex和SelectedValue SelectedItem一起用时,SelectIndex会先执行,SelectedValue、SelectedItem后执行,最后数据显示决定于SelectedItem或SelectedValue
SelectedValue只有在控件初始化时设置的初始值会更改显示Text,后续在后台更改值,文本都不会有变化,从后台更改选中项,请选择SelectedItem
网上看到很多说IsSynchronizedWithCurrentItem属性可以用于设置默认第一项,实际显示效果确实会第一项,但是绑定的SelectedItem和SelectedValue并不会自动赋值,仅仅只是更改了文本值
总结
以上皆是个人心得,如果错误,还请指正,谢谢