private static void AttachDataGrid(DataGridControl grid, Action <VisibleItemsChangedEventArgs> changed) { RVSContext context = new RVSContext(); context.Callback = changed; // To monitor collection changes ICollectionView view = CollectionViewSource.GetDefaultView(grid.ItemsSource); context.CollectionChangedHandler = delegate(object s, NotifyCollectionChangedEventArgs args) { DataGridControl_CollectionChanged(grid, args); }; view.CollectionChanged += context.CollectionChangedHandler; // To monitor scroll changes ScrollViewer scroller = grid.Template.FindName("PART_ScrollViewer", grid) as ScrollViewer; context.ScrollChangedHandler = delegate(object s, ScrollChangedEventArgs args) { DataGridControl_ScrollChanged(grid, args); }; scroller.ScrollChanged += context.ScrollChangedHandler; grid.SetValue(RVSContextProperty, context); // First time notification int start, end; CalculateIndexRange(grid, out start, out end); context.StartIndex = start; context.EndIndex = end; UpdateAndNotifyVisibleItems(grid); }
private static void DataGridControl_CollectionChanged(DataGridControl grid, NotifyCollectionChangedEventArgs e) { RVSContext context = grid.GetValue(RVSContextProperty) as RVSContext; int firstIndex, lastIndex; CalculateIndexRange(grid, out firstIndex, out lastIndex); context.StartIndex = firstIndex; context.EndIndex = lastIndex; UpdateAndNotifyVisibleItems(grid); }
private static void DetachDataGrid(DataGridControl grid) { RVSContext context = grid.GetValue(RVSContextProperty) as RVSContext; ICollectionView view = CollectionViewSource.GetDefaultView(grid.ItemsSource); view.CollectionChanged -= context.CollectionChangedHandler; ScrollViewer scroller = grid.Template.FindName("PART_ScrollViewer", grid) as ScrollViewer; scroller.ScrollChanged -= context.ScrollChangedHandler; context.Callback = null; grid.ClearValue(RVSContextProperty); }
private static void UpdateAndNotifyVisibleItems(DataGridControl grid) { RVSContext context = grid.GetValue(RVSContextProperty) as RVSContext; List <object> newItems = new List <object>(); List <object> oldItems = new List <object>(); List <object> unchangedItems = new List <object>(); for (int i = context.StartIndex; i <= context.EndIndex; i++) { object item = grid.Items[i]; if (context.VisibleItems.Contains(item)) { context.VisibleItems.Remove(item); unchangedItems.Add(item); } else { newItems.Add(item); } } oldItems = context.VisibleItems; context.VisibleItems = new List <object>(unchangedItems); context.VisibleItems.AddRange(newItems); if (oldItems.Count == 0 && newItems.Count == 0) { return; // No change } // Changes occurred, Notify VisibleItemsChangedEventArgs args = new VisibleItemsChangedEventArgs() { AddedItems = newItems, RemovedItems = oldItems }; context.Callback(args); }