下面的代码将返回一个新的字典,其中包含您绑定到组合框的相同数据。
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()
{
}
private void SaveNewUser(User user)
{
}
}
请注意使用
BindingList<T>
- 这将通知组合框列表中的任何更改。简单的
List<T>
也可以工作,但是您必须显式告诉组合框刷新数据绑定。
SelectedValue
或SelectedIndex
不就足够了吗? - Daniel BrücknerBindingList<T>
这个绝妙的想法!我会尝试并一定会告诉您结果。谢谢! - user1274686