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が指摘した単純なユースケースでは機能しましたが、実際のアプリケーションでは正しく機能させることができませんでした。

結局のところ、そして理由はわかりません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));
    }
}
于 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 に答える