private static void RefreshVisibleItems(ScrollViewer scrollViewer) { ScrollBar verticalScrollBar = FindChildren <ScrollBar>(scrollViewer).FirstOrDefault(s => s.Orientation == Orientation.Vertical); if (verticalScrollBar != null) { PropertyDataGrid dataGrid = GetSenderDataGrid(scrollViewer); int totalCount = dataGrid.Items.Count; int firstVisible = (int)verticalScrollBar.Value; int lastVisible = (int)(firstVisible + totalCount - verticalScrollBar.Maximum); //List<Person> visiblePersons = new List<Person>(); List <object> visibleItems = new List <object>(); for (int i = firstVisible; i <= lastVisible; i++) { if (i < dataGrid.Items.Count) { visibleItems.Add(dataGrid.Items[i]); } } SetVisibleItems(dataGrid, visibleItems); CommandManager.InvalidateRequerySuggested(); } }
private static void OnObserveVisibleItemsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { PropertyDataGrid dataGrid = d as PropertyDataGrid; if (dataGrid == null) { return; } dataGrid.Loaded += DataGridLoaded; }
private static void DataGridUnloaded(object sender, RoutedEventArgs e) { PropertyDataGrid dataGrid = (PropertyDataGrid)sender; ScrollViewer scrollViewer = FindChildren <ScrollViewer>(dataGrid).FirstOrDefault(); if (scrollViewer != null) { scrollViewer.ScrollChanged -= ScrollViewerOnScrollChanged; } dataGrid.SizeChanged -= DataGridSizeChanged; dataGrid.Unloaded -= DataGridUnloaded; }
private static void DataGridLoaded(object sender, RoutedEventArgs routedEventArgs) { PropertyDataGrid dataGrid = (PropertyDataGrid)sender; dataGrid.Loaded -= DataGridLoaded; ScrollViewer scrollViewer = FindChildren <ScrollViewer>(dataGrid).FirstOrDefault(); if (scrollViewer != null) { SetSenderDataGrid(scrollViewer, dataGrid); scrollViewer.ScrollChanged += ScrollViewerOnScrollChanged; //ScrollViewerOnScrollChanged(scrollViewer, null); RefreshVisibleItems(scrollViewer); } dataGrid.SizeChanged += DataGridSizeChanged; dataGrid.Unloaded += DataGridUnloaded; }
private static void SetSenderDataGrid(DependencyObject element, PropertyDataGrid value) { element.SetValue(SenderDataGridProperty, value); }