Ejemplo n.º 1
0
        void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
        {
            switch (e.Action)
            {
            case NotifyCollectionChangedAction.Add:
                if (e.NewStartingIndex < 0)
                {
                    goto case NotifyCollectionChangedAction.Reset;
                }

                for (int i = e.NewItems.Count - 1; i >= 0; i--)
                {
                    SourceItems.Insert(e.NewStartingIndex, e.NewItems[i]);
                }
                break;

            case NotifyCollectionChangedAction.Remove:
                foreach (var item in e.OldItems)
                {
                    SourceItems.RemoveAt(e.OldStartingIndex);
                }
                break;

            case NotifyCollectionChangedAction.Move:
                for (var i = 0; i < e.OldItems.Count; i++)
                {
                    var oldi = e.OldStartingIndex;
                    var newi = e.NewStartingIndex;

                    if (e.NewStartingIndex < e.OldStartingIndex)
                    {
                        oldi += i;
                        newi += i;
                    }

                    SourceItems.Move(oldi, newi);
                }
                break;

            case NotifyCollectionChangedAction.Replace:
            case NotifyCollectionChangedAction.Reset:
            default:
                ReloadData();
                break;
            }

            Device.BeginInvokeOnMainThread(() => List.UpdateLayout());
        }
        void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
        {
            switch (e.Action)
            {
            case NotifyCollectionChangedAction.Add:
                if (e.NewStartingIndex < 0)
                {
                    goto case NotifyCollectionChangedAction.Reset;
                }

                // if a NewStartingIndex that's too high is passed in just add the items.
                // I realize this is enforcing bad behavior but prior to this synchronization
                // code being added it wouldn't cause the app to crash whereas now it does
                // so this code accounts for that in order to ensure smooth sailing for the user
                if (e.NewStartingIndex >= SourceItems.Count)
                {
                    for (int i = 0; i < e.NewItems.Count; i++)
                    {
                        SourceItems.Add((e.NewItems[i] as BindableObject).BindingContext);
                    }
                }
                else
                {
                    for (int i = e.NewItems.Count - 1; i >= 0; i--)
                    {
                        SourceItems.Insert(e.NewStartingIndex, (e.NewItems[i] as BindableObject).BindingContext);
                    }
                }

                break;

            case NotifyCollectionChangedAction.Remove:
                for (int i = e.OldItems.Count - 1; i >= 0; i--)
                {
                    SourceItems.RemoveAt(e.OldStartingIndex);
                }
                break;

            case NotifyCollectionChangedAction.Move:
                for (var i = 0; i < e.OldItems.Count; i++)
                {
                    var oldi = e.OldStartingIndex;
                    var newi = e.NewStartingIndex;

                    if (e.NewStartingIndex < e.OldStartingIndex)
                    {
                        oldi += i;
                        newi += i;
                    }

                    SourceItems.Move(oldi, newi);
                }
                break;

            case NotifyCollectionChangedAction.Replace:
            case NotifyCollectionChangedAction.Reset:
            default:
                ClearSizeEstimate();
                ReloadData();
                break;
            }

            Device.BeginInvokeOnMainThread(() => List.UpdateLayout());
        }