这行得通:(在你的情况下)
将DrowdownStyle 设置为Dropdown 并绑定到组合框的Text 属性而不是SelectedItem。
对于这两个组合框,您似乎希望将文本绑定到Address 类实例的City 和Street 属性。您不似乎想在GetCityDataSource() 或GetCityDataSource() 或GetStreetDataSource() 方法返回的List<string> 中附加任何项目。
因此,由于下面绑定的Text target 属性没有与与您的数据源 关联的 (unchangeable) 项目集合纠缠在一起,因此以下修改应该使您的代码工作:(我已经使用 VS 2010 验证了以下代码更改的本质)。
CityComboBox.DataSource = GetCityDataSource();
StreetComboBox.DataSource = GetStreetDataSource();
Address address = new Address();
CityComboBox.DropDownStyle = ComboBoxStyle.DropDown
CityComboBox.DataBindings.Add("Text", address, "City");
StreetComboBox.DropDownStyle = ComboBoxStyle.DropDown
StreetComboBox.DataBindings.Add("Text", address, "Street");
PS!仅当您想将城市和街道数据用于简单的 UI-指导时,上述方法才有效。您没有在地址数据和您为其注册地址的对象之间建立永久关系。如果您希望保持数据规范化,那么您可能希望将外键存储到 City、Street(可能还有 Zipcode)表中的条目中。
使用用户定义的街道和城市名称,您将获得大量模糊数据(例如Washington DC、WASHINGTON D.C.、St. Patricks rd.、Saint Patrick's road 等),这将使将来难以执行 SQL使用WHERE Street = [something] 查询。使用标准化数据,您只需执行WHERE StreetID = [specificID]。
编辑
如果您尝试在同一个 UI 对话框中同时进行两件事(选择街道和城市,例如个人/公司简介以及 维护应用程序的内部街道和城市列表),那么您必须使用不同的方法。
最简单的可能是在您的组合框旁边添加一个“新城市”和一个“新街道”按钮,并在用户在对话框中提供正确输入后更新组合框的数据源。
您还可以使用字符串“[add New]”向组合框数据源添加一个虚拟条目,并在选择此项时使用特殊处理。由于这种方法涉及篡改组合的源列表,因此很容易变得有点混乱。
示例应用
带有数据绑定 ComboBox 的示例表单,它使用 List<string> 数据源
选择预定义街道后的关键属性
选择自定义街道后的关键属性