EntityFramework EntityCollection观察CollectionChanged

时间:2011-03-31 15:55:21

标签: c# entity-framework inotifycollectionchanged entitycollection

我首先在应用程序中使用EntityFramework数据库。我想以某种方式通知我的ViewModel中EntityCollection的更改。它没有直接支持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的变化?

3 个答案:

答案 0 :(得分:2)

虽然它在@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));
    }
}

答案 1 :(得分:2)

你尝试过处理吗? AssociationChanged在对相关结束进行更改时发生。 (继承自RelatedEnd。)

它给出了一个参数,显示是否添加或删除了一个元素,并公开了该元素。

答案 2 :(得分:1)

您如何映射事件?粘贴代码并映射事件如下所示。

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");
    }