Как реализовать одностороннюю привязку коллекции для Listbox DataSource? - PullRequest
3 голосов
/ 21 апреля 2010

У меня, казалось бы, простая проблема в Winforms.

Я хочу реализовать коллекцию, которая может использоваться в качестве источника данных для списка. Я намерен использовать его для простых строк. Вот так:

MyBindingCollection<string> collection = new MyBindingCollection<string>();
listbox.DataSource = collection;

Я прочитал, что все, что мне нужно реализовать, это IList интерфейс. Однако я бы хотел, чтобы список обновлялся сам по себе:

collection.Add('test');
collection.RemoveAt(0):

Как мне создать такую ​​коллекцию? Это только односторонняя привязка, мне не нужно обновлять коллекцию из графического интерфейса. (список доступен только для чтения).

1 Ответ

3 голосов
/ 21 апреля 2010

Попробуйте использовать BindingList<T>, это работает как для одностороннего, так и для двунаправленного связывания.

BindingList<string> list = new BindingList<string>();
listbox.DataSource = list;

list.Add("Test1");
list.Add("Test2");
list.RemoveAt(0);

Edit:
Добавлен пример решения с IBindingList
Вам не нужно реализовывать все методы для интерфейса IBindingList.
Те, которые вам не нужны, просто бросьте NotImplementedException.

public class MyBindingList : IBindingList
{
    private readonly List<string> _internalList = new List<string>();

    public int Add(object value)
    {
        _internalList.Add(value.ToString());
        var listChanged = ListChanged;
        var newIndex = _internalList.Count - 1;
        if (listChanged != null)
        {
            listChanged(this, new ListChangedEventArgs(ListChangedType.ItemAdded, newIndex));
        }
        return newIndex;
    }

    public event ListChangedEventHandler ListChanged;

    public int IndexOf(object value) // No need for this method
    {
        throw new NotImplementedException();
    }

    // + all other methods on IBindingList interface
}
...