WPF中的集合元素,比如ComboBox存在多个选择相关的属性,以下以ComboBox为例介绍以下这些属性的用法。
ComboBox的ItemsSource需要绑定一个集合类属性,比如界面元素类的DataContenx为BackViewModel对象,在BackViewModel类中定义了:ObservableCollection<Student> Students=....,可将Students绑定到ComboBox上。在ComboBox中,必须要显示在下拉列表框中的显示字段用DisplayMemberPath属性指出来,比如显示的为Name属性,则写法为:<ComboBox ItemsSource={Binding Sutdents},DisplayMemberPath="Name">。此时,该下拉列表框还不能接收选中的对象,为了接收选中的对象,需要将选中对象与程序的某个属性相互绑定。这时,可能有不同的绑定方式,可归纳为两种:
(1)第一种,将集合类中被Selected的成员直接绑定到BackViewModel对象的一个Student属性,比如名字为CurrentStudent,那么可以直接用SelectedItem进行绑定。
<ComboBox ItemsSource={Binding Sutdents},
SelectedItem={Binding CurrentStudent},
DisplayMemberPath="Name">
(2)第二中,如果程序不是直接将选中的对象绑定到Student类型的属性,而是绑定到Student成员类型的属性。例如Student含有Name、Gender、Age等属性,而只是需要绑定Name属性。这是,在BackViewModel类中定义一个string StudentName属性,然后利用SelectedValue和SelectedValuePath进行绑定,写法如下:
<ComboBox ItemsSource={Binding Sutdents},SelectedValue={Binding StudentName},SelectedValuePath="Name",DisplayMemberPath="Name">
也就是说,SelectedValue和SelectedValuePath应该是配对使用的,其作用是将集合对象中的被选中子对象的某个属性绑定到BackViewModel对象的某个属性,实现被选择对象的属性的实时记录。
那么,默认情况下,SelectedValue/SelectedValuePath实现的是双向绑定吗,经过测试,答案确实是双向绑定的。不过,通过后台代码修改StudentName属性时,修改后的结果需要是Students所有成员的名字之一,否则ComboBox显示未选择状态(即显示为空的状态)。
Selector
Selector是一个抽象类,继承ItemsControl类(包含任何类型的对象(例如字符串,图像或面板)的集合),而本文的4个兄弟都是Selector类下的4个属性。
SelectIndex
SelectIndex的作用是
获取或设置当前选择项中第一项的索引,如果选择项为空,则返回负数(-1)
大致理解成将集合像数据那样排序,index就是序号,根据序号设置获取选中项。
以下代码表示选择索引为0也就是默认选中第一项。
<ListBox Margin="10,0,0,5" Selec
【代码】C#或
wpf
或MFC
ComboBox
.OnSelectionChanged(SelectionChangedEventArgs) 获取变改后的值,不要直接获取。又一坑。
1、
comboBox
.
SelectedItem
是指当前选定项的对象,而不是文本;
SelectedItem
属性设置为一个对象时,
ComboBox
尝试使该对象成为列表中当前选定的对象。如果在列表中找到了该对象,则将它显示在
ComboBox
的编辑部分,并且将SelectedIndex属性设置为相应的索引。如果列表中不存在该对象,则SelectedIndex属性保留其当前值。
2、comboB
在下拉框
ComboBox
中,有
SelectedValue
跟
SelectedValuePath
这两个属性,我总是搞混,现在写一篇文章来梳理下:
1.ItemSource:这个不用多说,数据源,是一个对象列表,在MVVM中,我们常用ObservableCollection<T>来定义ItemSource的对象源;
2.
SelectedItem
:这也好说,选中的对象,这里的数据刚上是上者...
在编写程序的时候,由于不是使用标准的MVVM模式进行数据操作的,再给
ComboBox
的
SelectedItem
做Binding的时候需要如下工作:
namespace CodeBehindBinding
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
public virtual ListItem
SelectedItem
{ get { int selectedIndex = this.SelectedIndex; if (selectedIndex >= 0) { return this.Items[selectedIndex]; } return null; } } public virtual string
SelectedValue
这次绑定是一次非常痛苦的经历,因为
SelectedValue
总是不能生效!我一度怀疑是
wpf
的Bug。其实还是自己没搞清楚。在之前的一篇文章中:我也写个
ComboBox
的绑定,但是当时没有指定ItemsSource,而是将子项直接写道前台里面。因为当时每个条目就是简单的字符串而且是固定的。而这次每个Items都是一个复杂的数据结构,而且ItemsSource会发生变化。
WPF
下给
ComboBox
设置绑定字段时可通过如下设置:
combobox
.
SelectedValuePath
= "编号" ;//为隐藏的一个字段
combobox
.DisplayMemberPath = "名称" ;//为显示的字段
获得隐藏字段方式:
combobox
.
SelectedValue
.ToString ();
获得显示的字段:
combobox
.Text
补充:
WPF
中的
ComboBox
框赋值
WPF
中的
ComboBox
框不能直接[c#教程](https://www.xin372