我有两个ListBox,我想在它们之间移动项目。代码如下所示:
private void FillItems()
{
allItems = GetAllItems();
availableItems = new List<string>(allItems);
selectedItems = new List<string>();
itemsListBox.DataSource = availableItems;
selectedItemsListBox.DataSource = selectedItems;
}
private void addItemButton_Click(object sender, EventArgs e)
{
var itemsToAdd = itemsListBox.SelectedItems;
foreach (string item in itemsToAdd)
{
availableItems.Remove(item);
selectedItems.Add(item);
}
}
足够简单。我将字符串从一个列表移动到另一个列表
现在这不起作用,就像它不应该这样。我意识到它缺少一些通知集合变更的方法。所以我尝试了这些选项:
在列表框中调用Refresh()
。无济于事。
使用额外的数据绑定层(BindingSource
)。也没有用。
在控件上调用ResetBindings()
。仍然没有。
我在这里做错了什么?我应该使用某种可观察的收藏品吗?
答案 0 :(得分:2)
如果导入System.ComponentModel命名空间,则可以使用字符串的绑定列表,该列表将自动引发更改事件:
private void FillItems()
{
allItems = GetAllItems();
availableItems = new BindingList<string>(allItems);
selectedItems = new BindingList<string>();
itemsListBox.DataSource = availableItems;
selectedItemsListBox.DataSource = selectedItems;
}
private void addItemButton_Click(object sender, EventArgs e)
{
object itemsToAdd = itemsListBox.SelectedItems;
foreach (string item in itemsToAdd) {
availableItems.Remove(item);
selectedItems.Add(item);
}
}
此链接提供了有关可观察集合和绑定列表之间差异的更多信息。 difference between ObservableCollection and BindingList
答案 1 :(得分:0)
我更喜欢使用ObservableCollection,因为你不需要自己刷新绑定,看看
答案 2 :(得分:0)
您也可以使用BindingList
BindingList和ObservableCollection之间的差异解释了here)