2009-09-12 199 views
1

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

我有一个简单的表单,它包含一个文件选取器和一个comboxbox。每次选择文件时,我都会从文件读取一个字符串列表到一个List对象,并设置comboBox.DataSource = listOfStrings。在表单加载事件中,我设置了comboBox.DataBindings.Add(“SelectedItem”,myObject,“PickedValue”);

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

这就是整个故事。

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

我认为原因是,当我尝试检查组合框时,它作为SelectedItem为null。当我尝试将焦点移到其他地方时,触发组合框的数据绑定。基础上,它会尝试将选定的项目转换为字符串,并使用该转换后的字符串更新myObject.PickedValue。由于您无法将null转换为字符串,因此数据绑定验证失败,并且验证机制不允许将我的焦点移到其他地方,而我在此刻被吸引,甚至无法移动以选择文件。

我的问题是,我的应用场景中的常规绑定设置工作流程是什么以防止此陷阱?设置这种数据绑定的正确顺序是什么,所以我可以在数据源被某些东西填满之前检查我的组合框?我试图将myObject.PickedValue绑定到组合框的SelectedText属性(我注意到SelectedText是一个字符串,并且永远不会为null,即使SelectedItem为null)。但有趣的是,即使我从组合框中选择了某些东西,当数据绑定被触发时,SelectedText仍然是空字符串。这里有什么问题?

感谢您的任何帮助。

回答

1

这看起来不对;应该可以将字符串属性设置为null。可能焦点问题在于别处。你有没有试过在你的物业设置上设置一个断点来确认你的理论?

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

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

+0

感谢您给我一个解决方法。我认为禁用组合框直到准备就绪是个好主意。谢谢你解释为什么SelectedText属性不适合我。我想我会以此作为答案。 – Steve 2009-09-13 22:52:39

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"); 
     } 
    } 
} 

在设计,结合了“组合框”到HasListOfStrings属性的“已启用”属性。你可以做到这一点的代码:

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

我也建议你容器(或容器的容器)的AutoValidate属性更改为EnableAllowFocusChange

+0

感谢拉里的解决方法。这个想法与Paul的相似,特别感谢你的代码。我只是因为他回答了我的SelectedText问题才将他作为答案。但基本上你的和他一样有帮助。干杯。 – Steve 2009-09-13 22:53:58

+0

很高兴能帮到你! – XXXXX 2009-09-14 01:01:16