我有下面的代码
FooCB.DisplayMember = "FooNome";
FooCB.ValueMember = "Foo";
FooCB.DataSource = FooRepository.Instance.All();
FooCB.DataBindings.Add("SelectedItem", Bar, "Foo");
但是当我显示表单时,SelectedItem
它总是第一个。我究竟做错了什么?
我有下面的代码
FooCB.DisplayMember = "FooNome";
FooCB.ValueMember = "Foo";
FooCB.DataSource = FooRepository.Instance.All();
FooCB.DataBindings.Add("SelectedItem", Bar, "Foo");
但是当我显示表单时,SelectedItem
它总是第一个。我究竟做错了什么?
我最近一直在为 Winforms 组合框和数据绑定的行为而苦苦挣扎,这些是我在将 绑定ComboBox.DataSource
到项目列表并将对象属性绑定到.Net4 时的观察结果ComboBox.SelectedItem
。
将对象列表(在您的情况下List<Foo>
)绑定到ComboBox.DataSource
时,列表中的第一个对象始终显示在组合框中。
如果您将对象属性绑定到ComboBox.SelectedItem
(在您的情况下Bar.Foo
)并且该对象属性与组合框列表对象之一匹配,则该对象将显示在组合框中。如果对象属性为 null ( Bar.Foo == null
) 或对象属性不在组合框列表中,则第一个对象显示在组合框中。
设置ComboBox.SelectedItem = null
或ComboBox.SelectedIndex = -1
清除组合框上显示的项目,即使这似乎是警告它。并将您的绑定对象属性设置为空。
如果用户在使用ComboBox.DropDownStyle == DropDown
(使用退格键)时清除了组合框选择,则绑定对象属性设置为 null。
如果您已INotifyPropertyChanged
在其属性绑定到Combobox.SelectedItem
( Bar.Foo
) 的对象上实现,并且您以编程方式将绑定属性设置为一个值,并且该值出现在组合框列表中,则将显示更改的值。如果将属性设置为 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 保留在新选项列表中仍然有效的先前选择只有在先前的选择在列表中保持完全相同的位置时才有效。你几乎会认为这是非常非常近期的演讲经验的声音......