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);
 }