组合框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总是第一个。我做错了什么?

组合框SelectedItem不起作用

我最近一直在与Winforms组合框和数据绑定的行为作斗争,这些是我的观察(. net 4)当将ComboBox.DataSource绑定到项目列表并将对象属性绑定到ComboBox.SelectedItem时。

  1. 当将对象列表(在您的示例中为List<Foo>)绑定到ComboBox.DataSource时,列表中的第一个对象总是显示在组合框中。

  2. 如果你将一个对象属性绑定到ComboBox.SelectedItem(在你的例子中是Bar.Foo),并且该对象属性匹配一个组合框列表对象,那么该对象将显示在组合框中。如果对象属性为空(Bar.Foo == null)或对象属性不在组合框列表中,则第一个对象将显示在组合框中。

  3. 设置ComboBox.SelectedItem = nullComboBox.SelectedIndex = -1清除组合框上显示的项目,即使这似乎是对它的警告。并将绑定对象属性设置为null。

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

  5. 如果你已经在对象上实现了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来持久化在新选项列表中仍然有效的先前选择,只有当先前的选择在列表中占据完全相同的位置时才有效。你几乎会认为这是最近经历的声音…