Отменить событие изменения коллекции в наблюдаемой коллекции - PullRequest
2 голосов
/ 29 ноября 2011

Как я могу отменить событие изменения коллекции в наблюдаемой коллекции? Когда моя коллекция изменяется, она вызывает методы на сторонних dll. Эти методы могут или не могут потерпеть неудачу.

Если они терпят неудачу, я не хочу, чтобы элемент был добавлен или удален из коллекции. Глядя на имя, похоже, что событие изменения коллекции запускается после того, как что-то было добавлено или удалено, но как я могу достичь своей функциональности?

Ответы [ 4 ]

1 голос
/ 23 июня 2013

Слишком поздно, но это может помочь кому-то еще:

class ExtendedObservableCollection<T> : ObservableCollection<T>
{
    private bool _suppressNotification = false;

    public bool AllowNotifications { get { return _suppressNotification; } }

    protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
    {
        if (!_suppressNotification)
            base.OnCollectionChanged(e);
    }

    protected override void OnPropertyChanged(PropertyChangedEventArgs e)
    {
        if (!_suppressNotification)
            base.OnPropertyChanged(e);
    }

    public void ActivateNotifications()
    {
        _suppressNotification = false;
    }

    public void DesactivateNotifications()
    {
        _suppressNotification = true;
    }

    public void AddRange(IEnumerable<T> list)
    {
        if (list == null)
            throw new ArgumentNullException("list");

        _suppressNotification = true;

        foreach (T item in list)
        {
            Add(item);
        }
        _suppressNotification = false;
        OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add));
    }


}
0 голосов
/ 29 ноября 2011

Если вам удастся обработать событие в вашем коде, NotifyCollectionChangedEventArgs.NewItems возвращает IList новых элементов, участвующих в изменении.Затем вы можете удалить эти элементы из коллекции, если методы в сторонних dll не пройдены.

0 голосов
/ 22 марта 2013

Я поделюсь домашним хаком, который придумал для своего решения WPF / MVVM.В методах, которые я вызываю для e.Action == NotifyCollectionChangedAction.Remove или e.Action == NotifyCollectionChangedAction.Add, я проверяю наличие ошибок и предпринимаю любые действия, необходимые для отмены изменения, и задаю для логического члена _updateObservable значение true.Поскольку я не могу изменить ObservableCollection во время события изменения, я должен отложить его.Установка логического значения казалась самой простой вещью.

Тогда в модели представления у меня есть свойство, используемое для привязки выбранного элемента к наблюдаемой.Я добавил к этому свойству метод get if (_updateObservable) UpdateObservable(); Похоже, что свойство привязанного выбранного элемента всегда запускает его получатель, даже если добавленный или удаленный элемент не влияет напрямую на выбранный элемент.UpdateObservable () добавляет обратно или удаляет любые элементы, необходимые из коллекции, и устанавливает для флага значение false.

0 голосов
/ 29 ноября 2011

Вы можете просто переопределить этот конкретный метод, используя новую команду.

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