我有以下代码
FooCB.DisplayMember = "FooNome";
FooCB.ValueMember = "Foo";
FooCB.DataSource = FooRepository.Instance.All();
FooCB.DataBindings.Add("SelectedItem", Bar, "Foo");
但是当我显示表单时,SelectedItem
始终是第一个。
我做错了什么?
答案 0 :(得分:1)
我最近对Winforms组合框和数据绑定的行为进行了一些努力,这些是我将ComboBox.DataSource
绑定到项列表并将对象属性绑定到{{1}时的观察结果(.Net4) }}
将对象列表(在您的情况下为ComboBox.SelectedItem
)绑定到List<Foo>
时,列表中的第一个对象始终显示在组合框中。
如果将对象属性绑定到ComboBox.DataSource
(在您的情况下为ComboBox.SelectedItem
)并且该对象属性与其中一个组合框列表对象匹配,则该对象将显示在组合框中。如果object属性为null(Bar.Foo
)或对象属性不在组合框列表中,则第一个对象将显示在组合框中。
设置Bar.Foo == null
或ComboBox.SelectedItem = null
会清除组合框中显示的项目,即使this似乎警告它。并将绑定的对象属性设置为null。
如果用户在使用ComboBox.SelectedIndex = -1
(使用退格键)时清除组合框选择,则绑定对象属性将设置为null。
如果您已对其属性绑定到ComboBox.DropDownStyle == DropDown
(INotifyPropertyChanged
)的对象实施Combobox.SelectedItem
,并以编程方式将绑定属性设置为值,并且该值显示在组合框列表然后将显示更改的值。如果将属性设置为null或不在列表中的值,则组合框显示的值不会更改。
那么你能做些什么呢?我唯一真正的问题是当我的绑定属性为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保留在新选项列表中仍然有效的先前选择。您几乎会以为这是最近一次非常有经验的演讲的声音...