WPF, ObservableCollections, привязки и прочее. Когда я пытаюсь удалить всю коллекцию, я могу удалить только половину - PullRequest
0 голосов
/ 19 ноября 2018

Я пришел в WPF из winforms, и я новичок в этом.Вот мой вопрос .Когда я несколько раз пытаюсь удалить элементы из ObservableCollection, привязанные к ListBox через лямбда-выражение, это работает просто отлично:

ObservableCollectionGoodsListBoxTemp.ToList().All(i => ObservableCollectionGoodsListBoxTemp.Remove(i));

Но когда я пытаюсь использовать этот метод, я могу удалить только половину элементов для каждоговремя выполнения этого кода:

for (int i = 0; i < ObservableCollectionGoodsListBoxTemp.Count; i++)
{
    MessageBox.Show(ObservableCollectionGoodsListBoxTemp.Count.ToString() + " " + i.ToString());
        ObservableCollectionGoodsListBoxTemp.RemoveAt(i);
        PropertyChanged.Invoke(this, new PropertyChangedEventArgs(nameof(ObservableCollectionGoodsListBoxTemp)));

}

1 Первый вопрос: почему.
2 Второй вопрос: глуп ли этот вопрос?3 Третий вопрос: как получить контроль над WPF и понять, как с ним работать, если вопрос глупый

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

удаление элементов из ObservableCollection по одному крайне неэффективно. Это приведет к N уведомлениям об изменениях коллекции и обновлениям пользовательского интерфейса, где N - исходный размер коллекции.

любой Collection<T> имеет Clear() метод.

сделай это просто

ObservableCollectionGoodsListBoxTemp.Clear();
0 голосов
/ 19 ноября 2018

Вы не должны продвигать i после удаления элемента i, например,

while (ObservableCollectionGoodsListBoxTemp.Any())
{
    ObservableCollectionGoodsListBoxTemp.RemoveAt(0);
}

Также нет необходимости вызывать событие PropertyChanged.ObservableCollection вызывает события CollectioNChanges автоматически при добавлении или удалении чего-либо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...