сделать что-то до изменения коллекции в observablecollection в wpf - PullRequest
3 голосов
/ 10 июня 2011

Я не уверен, что то, чего я пытаюсь достичь, реально достижимо или нет.

У меня есть наблюдаемая коллекция со мной, и ее событие с измененной коллекцией уже обработано. Что я хочу сделать, так это сделать некоторые изменения в существующем списке объектов в наблюдаемой коллекции непосредственно перед тем, как будет запущено событие коллекции изменений в наблюдаемой коллекции. Другими словами, я хочу сделать что-то с существующим списком объектов в наблюдаемой коллекции, прежде чем кто-либо добавит или удалит какой-либо объект из наблюдаемой коллекции. Что-то вроде обработки события обмена коллекцией, но, к сожалению, в наблюдаемой коллекции такого события нет. Я надеюсь, что я достаточно ясно.

Ответы [ 4 ]

4 голосов
/ 10 июня 2011

Поскольку вам нужно предпринять действия до того, как пользователь изменит коллекцию, я считаю, что ваше CollectionChangedEvent происходит слишком поздно (коллекция уже изменилась).

Вместо этого рассмотрим создать свой собственный класс коллекции, производный от ObservableCollection , а затем переопределить методы Add (), Insert () и Remove (), чтобы выполнить дополнительную обработку перед вызовом реализации базового класса.Вы должны быть в состоянии найти примеры этого в Интернете.

Вот пример кода, с которого можно начать.Происходит из коллекции:

public class MyCollection<T> : Collection<T>, INotifyCollectionChanged, INotifyPropertyChanged
{
    public MyCollection(Collection<T> list)
        : base(list)
    {
    }

    public MyCollection()
        : base()
    {
    }

    #region INotifyCollectionChanged Members

    public event NotifyCollectionChangedEventHandler CollectionChanged;

    protected void NotifyChanged(NotifyCollectionChangedEventArgs args)
    {
        NotifyCollectionChangedEventHandler handler = CollectionChanged;
        if (handler != null)
        {
            handler(this, args);
        }
    }
    #endregion

    public new void Add(T item)
    {
        // Do some additional processing here!

        base.Add(item);
        this.NotifyChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item, base.Count-1));
        this.OnPropertyChanged("Count");
    }
}
2 голосов
/ 10 июня 2011

Вы были достаточно ясны, и простой ответ таков: такого события нет и оно невозможно.
Единственное решение, которое я могу придумать, - это извлечь из ObservableCollection<T> и реализовать эту функциональность самостоятельно, т. Е. При реализации Add сначала нужно вызвать событие CollectionChanging, а затем вызвать метод Add базового класса. Вы бы сделали то же самое для всех других соответствующих методов.

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

0 голосов
/ 10 июня 2011

Вы можете создать собственную реализацию INotifyCollectionChanged, которая обернет коллекцию, прослушивает событие, изменяет коллекцию соответствующим образом и затем отправляет событие вместе.

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

0 голосов
/ 10 июня 2011

На самом деле событие изменения коллекции в ObservableCollection вызывается, когда (среди прочего):

  • Вы добавляете элемент в ObservableCollection.
  • Вы удаляете элемент из ObservableCollection.
  • Вы очищаете ObservableCollection.

Когда я говорю «вы», это означает, что если происходит событие CollectionChanged, это означает, что «ВЫ» (понимаете: что-то в вашем приложении) имеетдобавил, удалил или очистил список.

При этом, я думаю, вам просто нужно найти, где происходят эти действия, и поместить свой код здесь ...

...