Exemple #1
0
 /// <summary>
 /// Construct a new instance of ObjectView using the supplied IObjectViewData and event data source.
 /// </summary>
 /// <param name="viewData">
 /// Object that maintains the underlying bound list,
 /// and specifies the operations allowed on that list.
 /// </param>
 /// <param name="eventDataSource">
 /// Event source to "attach" to in order to listen to collection and item changes.
 /// </param>
 internal ObjectView(IObjectViewData <TElement> viewData, object eventDataSource)
 {
     _viewData = viewData;
     _listener = new ObjectViewListener(this, (IList)_viewData.List, eventDataSource);
 }
        public ListChangedEventArgs OnCollectionChanged(object sender, CollectionChangeEventArgs e, ObjectViewListener listener)
        {
            ListChangedEventArgs changeArgs = null;

            switch (e.Action)
            {
            case CollectionChangeAction.Remove:
                // An Entity is being removed from entity collection, remove it from list.
                if (e.Element is TViewElement)
                {
                    TViewElement removedItem = (TViewElement)e.Element;

                    int oldIndex = _bindingList.IndexOf(removedItem);
                    if (oldIndex != -1)
                    {
                        _bindingList.Remove(removedItem);

                        // Unhook from events of removed entity.
                        listener.UnregisterEntityEvents(removedItem);

                        changeArgs = new ListChangedEventArgs(ListChangedType.ItemDeleted, oldIndex /* newIndex*/, -1 /* oldIndex*/);
                    }
                }
                break;

            case CollectionChangeAction.Add:
                // Add the entity to our list.
                if (e.Element is TViewElement)
                {
                    // Do not process Add events that fire as a result of committing an item to the entity collection.
                    if (!_itemCommitPending)
                    {
                        TViewElement addedItem = (TViewElement)e.Element;

                        _bindingList.Add(addedItem);

                        // Register to its events.
                        listener.RegisterEntityEvents(addedItem);

                        changeArgs = new ListChangedEventArgs(ListChangedType.ItemAdded, _bindingList.Count - 1 /* newIndex*/, -1 /* oldIndex*/);
                    }
                }
                break;

            case CollectionChangeAction.Refresh:
                foreach (TViewElement entity in _bindingList)
                {
                    listener.UnregisterEntityEvents(entity);
                }

                _bindingList.Clear();

                foreach (TViewElement entity in _entityCollection.GetInternalEnumerable())
                {
                    _bindingList.Add(entity);

                    listener.RegisterEntityEvents(entity);
                }

                changeArgs = new ListChangedEventArgs(ListChangedType.Reset, -1 /*newIndex*/, -1 /*oldIndex*/);
                break;
            }

            return(changeArgs);
        }
        public ListChangedEventArgs OnCollectionChanged(object sender, CollectionChangeEventArgs e, ObjectViewListener listener)
        {
            ListChangedEventArgs changeArgs = null;

            // Since event is coming from cache and it might be shared amoung different queries
            // we have to check to see if correct event is being handled.
            if (e.Element.GetType().IsAssignableFrom(typeof(TElement)) &&
                _bindingList.Contains((TElement)(e.Element)))
            {
                TElement item      = (TElement)e.Element;
                int      itemIndex = _bindingList.IndexOf(item);

                if (itemIndex >= 0) // Ignore entities that we don't know about.
                {
                    // Only process "remove" events.
                    Debug.Assert(e.Action != CollectionChangeAction.Refresh, "Cache should never fire with refresh, it does not have clear");

                    if (e.Action == CollectionChangeAction.Remove)
                    {
                        _bindingList.Remove(item);

                        listener.UnregisterEntityEvents(item);

                        changeArgs = new ListChangedEventArgs(ListChangedType.ItemDeleted, itemIndex /* newIndex*/, -1 /* oldIndex*/);
                    }
                }
            }

            return(changeArgs);
        }