EntityFramework EntityCollection Наблюдение КоллекцияChanged - PullRequest
5 голосов
/ 31 марта 2011

Сначала я использую базу данных EntityFramework в приложении. Я хотел бы как-то получать уведомления об изменениях EntityCollection в моей ViewModel. Он не поддерживает INotifyCollectionChanged (почему?), И мне не удалось найти другое решение.

Вот моя последняя попытка, которая не работает, потому что событие ListChanged не вызывается:

public class EntityCollectionObserver<T> : ObservableCollection<T>, INotifyCollectionChanged where T : class
{
    public event NotifyCollectionChangedEventHandler CollectionChanged;

    public EntityCollectionObserver(EntityCollection<T> entityCollection)
        : base(entityCollection)
    {
        IBindingList l = ((IBindingList)((IListSource)entityCollection).GetList());
        l.ListChanged += new ListChangedEventHandler(OnInnerListChanged);
    }

    private void OnInnerListChanged(object sender, ListChangedEventArgs e)
    {
        if (CollectionChanged != null) 
            CollectionChanged(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
    }
}

У кого-нибудь есть идеи, как я могу наблюдать за изменениями в EntityCollection?

Dan

Ответы [ 3 ]

2 голосов
/ 13 апреля 2011

Несмотря на то, что он работал в простом сценарии использования, отмеченном @Aron, я не смог заставить его работать должным образом в моем реальном приложении.внутреннее IBindingList из EntityCollection каким-то образом где-то может измениться.Причина, по которой мои наблюдатели не были вызваны, заключается в том, что они искали изменения на старом IBindingList, который даже не использовался EntityCollection.

Вот хак, который его получилу меня работает:

public class EntityCollectionObserver<T> : ObservableCollection<T> where T : class
{
    private static List<Tuple<IBindingList, EntityCollection<T>, EntityCollectionObserver<T>>> InnerLists 
        = new List<Tuple<IBindingList, EntityCollection<T>, EntityCollectionObserver<T>>>();

    public EntityCollectionObserver(EntityCollection<T> entityCollection)
        : base(entityCollection)
    {
        IBindingList l = ((IBindingList)((IListSource)entityCollection).GetList());
        l.ListChanged += new ListChangedEventHandler(OnInnerListChanged);


        foreach (var x in InnerLists.Where(x => x.Item2 == entityCollection && x.Item1 != l))
        {
            x.Item3.ObserveThisListAswell(x.Item1);
        }
        InnerLists.Add(new Tuple<IBindingList, EntityCollection<T>, EntityCollectionObserver<T>>(l, entityCollection, this));
    }

    private void ObserveThisListAswell(IBindingList l)
    {
        l.ListChanged += new ListChangedEventHandler(OnInnerListChanged);
    }

    private void OnInnerListChanged(object sender, ListChangedEventArgs e)
    {
        base.OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
    }
}
2 голосов
/ 17 апреля 2013

пытались ли вы обработать AssociationChanged Происходит, когда вносится изменение в связанный конец.(Унаследовано от RelatedEnd.)

Предоставляет аргументы, показывающие, был ли элемент добавлен или удален, а также предоставляет элемент.

1 голос
/ 06 апреля 2011

Как вы картируете событие?Вставка кода и отображение события, как показано ниже, работает для меня.

static void Main(string[] args)
    {
        EntityCollection<string> col = new EntityCollection<string>();
        EntityCollectionObserver<string> colObserver = new EntityCollectionObserver<string>(col);

        colObserver.CollectionChanged += colObserver_CollectionChanged;

        col.Add("foo");
    }

    static void colObserver_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        Console.WriteLine("Entity Collection Changed");
    }
...