组合框SelectedItem不起作用
本文关键字:不起作用 SelectedItem 组合 | 更新日期: 2023-09-27 18:03:37
下面有代码
FooCB.DisplayMember = "FooNome";
FooCB.ValueMember = "Foo";
FooCB.DataSource = FooRepository.Instance.All();
FooCB.DataBindings.Add("SelectedItem", Bar, "Foo");
但是当我显示表单时,SelectedItem
总是第一个。我做错了什么?
我最近一直在与Winforms组合框和数据绑定的行为作斗争,这些是我的观察(. net 4)当将ComboBox.DataSource
绑定到项目列表并将对象属性绑定到ComboBox.SelectedItem
时。
-
当将对象列表(在您的示例中为
List<Foo>
)绑定到ComboBox.DataSource
时,列表中的第一个对象总是显示在组合框中。 -
如果你将一个对象属性绑定到
ComboBox.SelectedItem
(在你的例子中是Bar.Foo
),并且该对象属性匹配一个组合框列表对象,那么该对象将显示在组合框中。如果对象属性为空(Bar.Foo == null
)或对象属性不在组合框列表中,则第一个对象将显示在组合框中。 -
设置
ComboBox.SelectedItem = null
或ComboBox.SelectedIndex = -1
清除组合框上显示的项目,即使这似乎是对它的警告。并将绑定对象属性设置为null。 -
如果用户在使用
ComboBox.DropDownStyle == DropDown
(带退格)时清除组合框选择,则绑定对象属性设置为null。 -
如果你已经在对象上实现了
INotifyPropertyChanged
,它的属性被绑定到Combobox.SelectedItem
(Bar.Foo
),并且你通过编程将绑定的属性设置为一个值,该值出现在组合框列表中,那么改变的值将被显示。如果您将属性设置为null或不在列表中的值,则组合框显示的值将不会改变。
那么你能做些什么呢?唯一真正的问题是,当我的绑定属性为null时,没有显示任何值,所以我刚刚显式地将Combobox.SelectedItem = null
设置为第3点。您可能能够扩展ComboBox
并覆盖默认行为,但到目前为止,我已经满足于这里和那里的额外代码行,并在非空属性上使用默认值。
可能您遗漏了一些声明。如果您从工具箱中创建了组合框,-我有类似的问题-您可能希望将组合框的名称添加为XAML上的标记。
除此之外,如果您通过代码动态创建它,请检查您是否缺少任何类声明。
我不能从OP的代码告诉我是否在回答他们的问题,但也许这将有助于有人阅读这个问题。ComboBox有四种方法来设置当前值:
SelectedIndex
SelectedItem
SelectedText
SelectedValue
你需要对你正在设置的内容保持一致(以及你正在使用的事件处理程序)。如果将SelectedIndex设置为不重要的值(小于-1或大于列表),则会得到错误。但是,如果将其他三个选项设置为该类型选择中不存在的值,则不会出现错误。
假设您使用Dictionary(这是伪代码)作为绑定源,并设置DisplayMember = "Value"和ValueMember = "Key",映射将是这样的:
SelectedIndex - -1 to index of last item
SelectedItem - KeyValuePair<Key, Value>
SelectedText - Dictionary value
SelectedValue - Dictionary key
向SelectedItem提供值或键将而不是生成错误,它将简单地像OP所描述的那样运行。这就是为什么我认为这个答案可能会对某人有所帮助。
我可能还会注意到,如果要交换ComboBox的内容,那么使用SelectedIndex并不总是安全的。假设ComboBox中有相同的基本类型的数据,但是与其他情况相比,在某些情况下选择是有限的。使用SelectedIndex来持久化在新选项列表中仍然有效的先前选择,只有当先前的选择在列表中占据完全相同的位置时才有效。你几乎会认为这是最近经历的声音…