Combobox SelectedItem不起作用

时间:2013-03-13 12:40:15

标签: c# winforms data-binding combobox

我有以下代码

FooCB.DisplayMember = "FooNome";
FooCB.ValueMember = "Foo";
FooCB.DataSource = FooRepository.Instance.All();
FooCB.DataBindings.Add("SelectedItem", Bar, "Foo");

但是当我显示表单时,SelectedItem始终是第一个。 我做错了什么?

3 个答案:

答案 0 :(得分:1)

我最近对Winforms组合框和数据绑定的行为进行了一些努力,这些是我将ComboBox.DataSource绑定到项列表并将对象属性绑定到{{1}时的观察结果(.Net4) }}

  1. 将对象列表(在您的情况下为ComboBox.SelectedItem)绑定到List<Foo>时,列表中的第一个对象始终显示在组合框中。

  2. 如果将对象属性绑定到ComboBox.DataSource(在您的情况下为ComboBox.SelectedItem)并且该对象属性与其中一个组合框列表对象匹配,则该对象将显示在组合框中。如果object属性为null(Bar.Foo)或对象属性不在组合框列表中,则第一个对象将显示在组合框中。

  3. 设置Bar.Foo == nullComboBox.SelectedItem = null会清除组合框中显示的项目,即使this似乎警告它。并将绑定的对象属性设置为null。

  4. 如果用户在使用ComboBox.SelectedIndex = -1(使用退格键)时清除组合框选择,则绑定对象属性将设置为null。

  5. 如果您已对其属性绑定到ComboBox.DropDownStyle == DropDownINotifyPropertyChanged)的对象实施Combobox.SelectedItem,并以编程方式将绑定属性设置为值,并且该值显示在组合框列表然后将显示更改的值。如果将属性设置为null或不在列表中的值,则组合框显示的值不会更改。

  6. 那么你能做些什么呢?我唯一真正的问题是当我的绑定属性为null时没有显示任何值,所以我刚刚在第3点明确设置Bar.Foo。您可以扩展Combobox.SelectedItem = null并覆盖默认行为,但到目前为止,我已满足于此处的额外代码行,并且在非可空属性上使用默认值。

答案 1 :(得分:0)

可能你错过了一些贬值。如果您从工具箱中创建了Combobox, - 我遇到了类似的问题 - 您可能希望在XAML上添加Combobox名称的名称作为标记。

除此之外,如果您是通过代码动态创建的,请检查您是否缺少类的任何删除。

答案 2 :(得分:0)

我无法从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保留在新选项列表中仍然有效的先前选择。您几乎会以为这是最近一次非常有经验的演讲的声音...