2011-02-27 264 views
1

更改Datagrid的.DataContext屬性(新源)時,所選項目將被清除,但滾動條位置將保留。爲了避免這種情況,我調用了.ScrollIntoView(.Item(0)),在更改datacontext之後,向上移動滾動條,但它顯示錯誤的頁面幾分之一秒,而當我在更改datacontext之前滾動到頂部時,我有同樣的問題重置WPF Datagrid滾動條位置

那麼,如何改變.DataContext,並在同一時間重新設置滾動條位置

編輯:我是否應該提及我的XAML看起來像這樣:

<DataGrid VirtualizingStackPanel.IsVirtualizing="True" VirtualizingStackPanel.VirtualizationMode="Recycling"> 

所以也許虛擬化是原因吧

回答

7

您是否嘗試過在DataContextChanged事件中爲ScrollViewer調用ScrollToTop

<DataGrid VirtualizingStackPanel.IsVirtualizing="True" 
      VirtualizingStackPanel.VirtualizationMode="Recycling" 
      DataContextChanged="dataGrid_DataContextChanged" 
      ...> 

private void dataGrid_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e) 
{ 
    ScrollViewer scrollViewer = GetVisualChild<ScrollViewer>(dataGrid); 
    if (scrollViewer != null) 
    { 
     scrollViewer.ScrollToTop(); 
    } 
} 

GetVisualChild

private static T GetVisualChild<T>(DependencyObject parent) where T : Visual 
{ 
    T child = default(T); 

    int numVisuals = VisualTreeHelper.GetChildrenCount(parent); 
    for (int i = 0; i < numVisuals; i++) 
    { 
     Visual v = (Visual)VisualTreeHelper.GetChild(parent, i); 
     child = v as T; 
     if (child == null) 
     { 
      child = GetVisualChild<T>(v); 
     } 
     if (child != null) 
     { 
      break; 
     } 
    } 
    return child; 
} 
+0

完美的答案。做得好!!! – iamCR 2015-12-07 10:06:23