我有两个清单。第一个是硬编码的,内容永远不会改变。用户可以编辑第二个来添加,更改和删除项目:
public List<Item> DefaultItems = new List<Item>();
public BindingList<Item> UserItems = new BindingList<Item>();
...
MyTable.DataSource = UserItems;
我想将两个列表的内容一个接一个地绑定到ComboBox,并在用户编辑UserItems列表时自动更新。
我可以通过以下方式轻松解决第一部分:
public List<Items> AllItems
{
get
{
List<Item> Items = new List<Item>();
foreach (Item I in DefaultItems) Items.Add(I);
foreach (Item I in UserItems) Items.Add(I);
return Items;
}
}
...
MyComboBox.DataSource = AllItems;
问题是当UserItems发生变化时,没有任何通知表明AllItems已经改变,因此组合框的内容保持不变。
然后我添加了一个在UserItems更改时生成的事件。现在我的问题是如何强制ComboBox刷新。执行以下操作:
MyComboBox.DataSource = null;
MyComboBox.DataSource = AllItems;
导致selecteditem变为null并且selectedindex变为-1,然后我必须在我的代码中处理(暂时记住当前项目,之后恢复它等)。这一切都变得非常混乱,我确信有一种聪明的方法可以解决这个问题。有吗?
谢谢,安迪更新:我不想以第三方程序集的形式为此添加更多代码和复杂性,所以我只是继续我的凌乱方法。感谢。
答案 0 :(得分:2)
您需要使用一个集合,该集合将在更改集合时通知UI。
您可以使用.NET提供的BindingList
类,或者,如果您想尝试不同的东西,可以下载包含现有集合的BindingListView
类,并为UI提供通知它需要。