以下代码将返回一个新字典,其中包含您绑定到组合框的相同数据。
var list = (List<KeyValuePair<String, String>>)cmbColor.DataSource;
var dictionary = list.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
该属性DataSource
将返回您分配的相同实例,但由于它是类型化Object
的,您必须将其转换回实际类型,然后才能访问任何成员。
但是你为什么不保留原来的字典呢?并且绝对支持修改绑定到数据源的列表——这就是数据绑定的重点。
我想我的回答并不能真正解决您的实际问题,仅解决您认为的问题所在。也许你可以提供一些关于你想要达到的目标的额外信息,我或其他人将能够帮助你解决你的潜在问题。
更新
这应该适用于您的场景 - 我坚持使用用户示例。
public class User
{
public String Id { get; set; }
public String Name { get; set; }
}
以及表单的代码。
public partial class MainForm : Form
{
private readonly BindingList<User> recentlyAddedUsers = new BindingList<User>();
private void MainFormLoad(Object sender, EventArgs e)
{
this.comboBoxRecentlyAddedUsers.DataSource = this.recentlyAddedUsers;
this.comboBoxRecentlyAddedUsers.ValueMember = "Id";
this.comboBoxRecentlyAddedUsers.DisplayMember = "Name";
var recentlyAddedUsersFromService = this.GetRecentlyAddedUsers();
foreach (var user in recentlyAddedUsersFromService)
{
this.recentlyAddedUsers.Add(user);
}
}
private void ButtonAddNewUserClick(Object sender, EventArgs e)
{
var newUser = new User();
newUser.Id = this.textBoxUserId.Text;
newUser.Name = this.textBoxUserName.Text;
this.SaveNewUser(newUser);
this.recentlyAddedUsers.RemoveAt(0);
this.recentlyAddedUsers.Insert(newUser);
}
private List<User> GetRecentlyAddedUsers()
{
// Get a list of recently added users from the database.
}
private void SaveNewUser(User user)
{
// Save the new user to the database.
}
}
BindingList<T>
请注意- 这将通知组合框有关列表的任何更改的用法。一个简单的List<T>
也可以,但是您必须明确告诉组合框刷新数据绑定。