ComboBox数据绑定问题

时间:2009-09-12 06:29:43

标签: c# winforms data-binding

我有一个与组合框相关的有趣的数据绑定问题。希望有人有一些好的建议。

我有一个简单的表单,它包含一个文件选择器和一个comboxbox。每次选择文件时,我都会从文件中读取一个字符串列表到List对象,然后设置comboBox.DataSource = listOfStrings。

在表单加载事件中,我设置了comboBox.DataBindings.Add(“SelectedItem”,myObject,“PickedValue”);

目的很明确:每次从组合框中选择一个字符串时,我想将字符串写入myObject.PickedValue。

这就是整个故事。

现在我启动表单,而不是选择文件,我先检查组合框。当然,此时,comboBox.DataSource为null,comboBox.SelectedItem也为null。但是已经设置了comboBox上的数据绑定(因为设置是在表单加载事件中)。现在我的焦点不能从组合框转移到其他任何地方。

我认为原因是,当我尝试检查组合框时,它的null为SelectedItem。当我尝试将焦点移动到其他位置时,会触发组合框的数据绑定。在底层,它尝试将所选项目转换为字符串并使用转换后的字符串更新myObject.PickedValue。由于您无法将null转换为字符串,因此数据绑定验证失败,并且验证机制不允许将焦点移动到其他位置,此时我感到很沮丧,甚至无法移动以选择文件。

我的问题是,为了防止这个陷阱,我的应用程序场景的正常绑定设置工作流程是什么?设置这样一个数据绑定的正确顺序是什么,这样我可以在数据源填充之前检查我的组合框?

仅供参考,我尝试将myObject.PickedValue绑定到组合框的SelectedText属性(我注意到SelectedText是一个字符串,并且永远不会为null,即使SelectedItem为null)。但有趣的是,即使我从组合框中选择了某些东西,当触发数据绑定时,SelectedText仍然是空字符串。这有什么不对?

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

失败比你描述的要简单一点:你的ComboBox只会因为没有选择的项目而失败,因为没有什么可以选择的。

如果没有什么可供选择,我会禁用ComboBox。这很容易做到。请记住在数据对象中连接PropertyChanged事件;绑定源将通过反射自动找到它。

class MyData
{
    public event PropertyChangedEventHandler PropertyChanged;

    // ...
    public HasListOfStrings { get { return ListOfStrings != null && 0 < ListOfStrings.Count; } }

    private void LoadListOfStrings
    {
        // ... load the list of strings ...

        if ( PropertyChanged) {
            PropertyChanged(this, "ListOfStrings");
            PropertyChanged(this, "HasListOfStrings");
        }
    }
}

在设计器中,将“ComboBox”的“Enabled”属性绑定到HasListOfStrings属性。您可以使用以下代码执行此操作:

listOfStringsComboBox.Bindings.Add ("Enabled", bindingSource, "HasListOfStrings");

我还建议您将容器(或容器的容器)的AutoValidate属性更改为EnableAllowFocusChange

答案 1 :(得分:1)

这似乎不对;应该可以将字符串属性设置为null。可能焦点问题在于其他地方。您是否尝试在属性设置器上设置断点以确认您的理论?

组合框的SelectedText属性是指在组合框的文本部分中选择的文本。仅当下拉样式设置为组合时才有效。基本上它是组合控件的文本框部分的选定文本(组合框被称为“组合”的原因是因为它是文本框和选择列表的组合)。除非用户正在编辑组合的文本部分,否则通常会期望此属性为空。

如果您希望此问题的解决方法与良好的用户体验一致,请尝试在表单加载时禁用组合框,然后在选择文件时启用它。