Удаление элемента ListBox - PullRequest
       28

Удаление элемента ListBox

2 голосов
/ 07 декабря 2010

У меня есть окно WPF, которое управляет наборами конфигураций и позволяет пользователям редактировать набор конфигурации (кнопка редактирования) и удалять набор конфигурации (кнопка удаления).У окна есть элемент управления ListBox, который перечисляет наборы конфигурации по имени, а его ItemsSource имеет набор привязок к списку наборов конфигурации.

Я пытаюсь удалить элемент в коде файла для окна..

private void RemoveButton_Click(object sender, RoutedEventArgs e)
{
    var removedItems = configSetListBox.SelectedItems;

    foreach(ConfigSet removedItem in removedItems)
    {
        configSetListBox.Items.Remove(removedItem);
    }
}

Мой код выдает недопустимое исключение операции, в котором говорится "Получайте доступ к элементам и изменяйте их с помощью ItemsControl.ItemsSource."Какое свойство я должен получить доступ для правильного удаления элементов из ListBox?Или есть более элегантный способ справиться с этим в WPF?Моя реализация немного WinForm-ish, если вы будете:)

Решение

private void RemoveButton_Click(object sender, RoutedEventArgs e)
{   
    foreach(ConfigSet removedItem in configSetListBox.SelectedItems)
    {
        (configSetListBox.ItemsSource as List<ConfigSet>).Remove(removedItem);
    }
    configSetListBox.Items.Refresh();
}

В моем случае у меня был List как тип привязки ItemSource, поэтомубросить это таким образом.Без обновления коллекции элементов ListBox не обновляется;так что это было необходимо для моего решения.

Ответы [ 5 ]

3 голосов
/ 07 декабря 2010

использование:

private void RemoveButton_Click(object sender, RoutedEventArgs e)
{
  foreach(ConfigSet item in this.configSetListBox.SelectedItems)
  {
      this.configSetListBox.ItemsSource.Remove(item); // ASSUMING your ItemsSource collection has a Remove() method
  }
}

Примечание: мое использование этого. просто так, как он более явный - он также помогает увидеть объект в пространстве имен класса, в отличие от переменной в методе, в котором мы находимся, - хотя это очевидно здесь.

1 голос
/ 07 декабря 2010

Это потому, что вы изменяете коллекцию, перебирая ее.

если у вас есть связанный элемент источника списка, чем пытаться удалить элементы из источника

0 голосов
/ 23 марта 2019
for (int i = lstAttachments.SelectedItems.Count - 1; i >= 0; i--)
{
   lstAttachments.Items.Remove(lstAttachments.SelectedItems[i]);
}

Самый простой способ удаления элементов из списка, по которому вы перебираете, - это обратный ход, поскольку он не влияет на индекс элементов, по которым вы перемещаетесь.

0 голосов
/ 19 апреля 2016

Я использовал эту логику, чтобы предшествовать. И это сработало.

вы можете хотите попробовать.

private void RemoveSelectedButton_Click(object sender, RoutedEventArgs e) {
        if (SelectedSpritesListBox.Items.Count <= 0) return;

        ListBoxItem[] temp = new ListBoxItem[SelectedSpritesListBox.SelectedItems.Count];
        SelectedSpritesListBox.SelectedItems.CopyTo(temp, 0);
        for (int i = 0; i < temp.Length; i++) {
            SelectedSpritesListBox.Items.Remove(temp[i]);
        }
    }
0 голосов
/ 07 декабря 2010

здесь уже дан ответ.

WPF - Лучший способ удалить элемент из Источника Items

Вам потребуется реализовать ObservableCollection, и тогда все, что вы с ней сделаете, будет отражено в вашем списке.

...