0

我有两个 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 回答 3

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);
    }
}

此链接包含有关可观察集合和绑定列表之间差异的更多信息。ObservableCollection 和 BindingList 的区别

于 2013-07-05T10:40:54.137 回答
0

我更喜欢使用 ObservableCollections 因为你不需要刷新绑定你自己,看看

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

于 2013-07-05T10:35:54.163 回答
0

您还可以使用BindingList

BindingList 和 ObservableCollection 之间的区别在这里解释)

于 2013-07-05T10:48:03.120 回答