将List <t>绑定(并刷新)到ListBox </t>

时间:2013-07-05 10:33:52

标签: c# winforms data-binding collections

我有两个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);
        }
    }

足够简单。我将字符串从一个列表移动到另一个列表

现在这不起作用,就像它不应该这样。我意识到它缺少一些通知集合变更的方法。所以我尝试了这些选项:

  1. 在列表框中调用Refresh()。无济于事。

  2. 使用额外的数据绑定层(BindingSource)。也没有用。

  3. 在控件上调用ResetBindings()。仍然没有。

  4. 我在这里做错了什么?我应该使用某种可观察的收藏品吗?

3 个答案:

答案 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,因为你不需要自己刷新绑定,看看

http://msdn.microsoft.com/en-us/library/ms668604.aspx

答案 2 :(得分:0)

您也可以使用BindingList

BindingList和ObservableCollection之间的差异解释了here