Я хотел бы иметь базовый ListBox со связанными кнопками Add и Delete. Кнопка «Удалить» включается, если и только если в ListBox есть выделение, а кнопка «Добавить» должна добавлять элемент в конец ListBox.
Моей первой попыткой было просто создать List<string> items
поле, например:
public partial class Form1 : Form {
public Form1 {
InitializeComponent();
this.listBox1.DataSource = this.items;
}
private void addButton_Click(object sender, EventArgs e) {
this.items.Add("item {this.items.Count + 1}");
}
private void deleteButton_Click(object sender, EventArgs e) {
this.items.RemoveAt(this.listBox1.SelectedIndex);
}
private void listBox1_SelectedIndexChanged(object sender, EventArgs e) {
this.deleteButton.enabled = (this.listBox1.SelectedIndex != -1);
}
List<string> items = new List<string>();
}
Но оказывается, что ListBox не обновляется автоматически при изменении элементов в списке. Вот связанный вопрос об этом.
Большинство советов предлагало просто запускать listBox1.DataSource = null; this.listBox1.DataSource = this.items;
каждый раз, когда я обновлял список, но для меня это побеждает цель привязки .
В другом ответе предлагалось использовать ObservableCollection
для типа данных моего списка, но это ничего не изменило.
Наконец я нашел класс BindingList
, и он, казалось, делал то, что я хочу; ListBox автоматически отражает содержимое поля items
. (Если есть другое решение, которое на самом деле представляет собой лучшую практику , а не какой-то фрагмент культового фольклора, распространенного в Интернете, пожалуйста, дайте мне знать.)
Однако, когда первый элемент, который я добавляю к items
, появляется в ListBox, строка становится выделенной. И я вижу, что listBox1.SelectedIndex
изменяется с -1 на 0. Но событие listBox1_SelectedIndexChanged
не срабатывает . Следовательно, состояние кнопки «Удалить» не обновляется должным образом.
(Кроме того, этот шаблон пользовательского интерфейса является чрезвычайно обычным делом, и кажется катастрофическим, что существует так много противоречивой информации о реализации такой простой вещи.)