using System.Windows; using System.Windows.Controls; using System.Windows.Input; using System.Windows.Media; namespace TestDataGrid; /// /// Interaction logic for MainWindow.xaml /// public partial class MainWindow { public MainWindowViewModel ViewModel { get => DataContext as MainWindowViewModel; set => DataContext = value; } public MainWindow() { InitializeComponent(); } private void Digit_OnPreviewTextInput(object sender, TextCompositionEventArgs e) { e.Handled = "0123456789".IndexOf(e.Text, StringComparison.Ordinal) < 0; } public void RefreshFromTopAndRestorePosition(Action updateData) { var scrollViewer = FindVisualChild(BusinesDataGrid); if (scrollViewer == null) { updateData(); return; } var verticalOffset = scrollViewer.VerticalOffset; var horizontalOffset = scrollViewer.HorizontalOffset; scrollViewer.ScrollToTop(); BusinesDataGrid.UpdateLayout(); updateData(); BusinesDataGrid.UpdateLayout(); scrollViewer = FindVisualChild(BusinesDataGrid); if (scrollViewer == null) return; var restoredVerticalOffset = Math.Min( verticalOffset, scrollViewer.ScrollableHeight); var restoredHorizontalOffset = Math.Min( horizontalOffset, scrollViewer.ScrollableWidth); scrollViewer.ScrollToVerticalOffset( restoredVerticalOffset); scrollViewer.ScrollToHorizontalOffset( restoredHorizontalOffset); BusinesDataGrid.UpdateLayout(); } private static T? FindVisualChild( DependencyObject parent) where T : DependencyObject { for (var i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++) { var child = VisualTreeHelper.GetChild(parent, i); if (child is T result) return result; var descendant = FindVisualChild(child); if (descendant != null) return descendant; } return null; } }