Попытка привязать список <T>к CheckedListBox в WinForms c # - PullRequest
3 голосов
/ 03 августа 2011

Я использую WinForms C # Есть ли способ получить следующее поведение:

  1. привязать список к CheckedListBox
  2. Когда я добавляю элементы в список, поле CheckedList обновляется
  3. Когда я изменяю CheckedListBox, список меняется

Я пытался сделать следующее:

Код конструктора:

checkedlistBox1.DataSource = a;
checkedlistBox1.DisplayMember = "Name";
checkedlistBox1.ValueMember = "Name";

Поле:

List<Binder> a = new List<Binder> { new Binder { Name = "A" } };

При нажатии кнопки 1:

private void butto1_Click(object sender, EventArgs e)
{
    a.Add(new Binder{Name = "B"});
    checkedListBox1.Invalidate();
    checkedListBox1.Update();
}

Но представление не обновляется.

Спасибо.

Ответы [ 3 ]

7 голосов
/ 03 августа 2011

Измените эту строку:

List<Binder> a = new List<Binder> { new Binder { Name = "A" } };

на эту:

BindingList<Binder> a = new BindingList<Binder> { new Binder { Name = "A" } };

Это будет просто работать без каких-либо других изменений.

Ключ к этому BindingList<T> реализует IBindingList, который уведомит элемент управления при изменении списка.Это позволяет элементу управления CheckedListBox обновлять свое состояние.Это двусторонняя привязка данных.

Кроме того, вы можете изменить эти две строки:

checkedListBox1.Invalidate();
checkedListBox1.Update();

на эту (более читаемая и, по сути, делает то же самое):

checkedListBox1.Refresh();
3 голосов
/ 03 августа 2011

Две вещи, на которые вы можете захотеть взглянуть:

  1. Использование BindingList
  2. Добавление BindableAttribute к вашему Имя свойство
1 голос
/ 03 августа 2011

Должна ли ваша List<Bender> быть какой-то наблюдаемой коллекцией, например, вместо ObservableCollection<Bender>?

...