5

我首先在应用程序中使用 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

4

3 回答 3

3

你是否尝试过处理 AssociationChanged 发生在对相关端进行更改时。(继承自 RelatedEnd。)

它提供了显示元素是添加还是删除的参数,并且还公开了该元素。

于 2013-04-17T09:42:18.287 回答
2

虽然它在@Aron 指出的简单用例中工作,但我无法让它在我的实际应用程序中正常工作。

事实证明,出于某种我不确定的原因 - 某种方式的内部IBindingListEntityCollection某处,可以改变。我的观察员没有被调用的原因是因为他们正在寻找一个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));
    }
}
于 2011-04-13T13:36:52.993 回答
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");
    }
于 2011-04-05T20:14:00.053 回答