2011-07-21 96 views
0

我基於WPF的DataGrid開發WPF用戶控件,支持動態列生成與我們自己的業務基於上下文菜單。WPF的DataGrid的ItemSource刷新 - GridColumns顯示奇怪的行爲

我產生了依賴屬性調用數據源,當我設置數據源調用自定義的方法綁定我的數據源動態創建列和設置的ItemSource屬性。所有的第一次都很好。我有一個名爲刷新的上下文菜單,當用戶單擊刷新時,SQL將執行並且上述操作的相同信息將會發生。在第二次,行和列完美創建。但是,當我做水平滾動列標題不能正常顯示,它在滾動時失去其視覺狀態。

我的自定義屬性 - 數據源

這是調用每次
public static DependencyProperty DataSourceProperty = 
     DependencyProperty.Register("DataSource", typeof(GridDataModel), typeof(MyGridView), 
     new PropertyMetadata((dependencyObject, eventArgs) => 
     { 
      if (eventArgs.OldValue != null) 
      { 
       ((GridDataModel)eventArgs.OldValue).Dispose(); 
      } 
      BindToDataSource((MyGridView)dependencyObject, (GridDataModel)eventArgs.NewValue);    
     })); 

我的自定義方法我設置DataSource屬性:

private static void BindToDataSource(MyGridView view, GridDataModel dataModel) 
    { 
     if (view.ViewModel != null) 
     {    
      BindingOperations.ClearAllBindings(view.GridView); 
      view.GridView.Items.Clear();     
      view.GridView.Columns.Clear();     
      view.GridView.ItemsSource = null;     
      view.ViewModel.Dispose();     
     } 
     view.ViewModel = new MyGridViewModel(dataModel); 
     view.ViewModel.PrepareGridView(); 
     view.LayoutRoot.DataContext = view.ViewModel; 
     view.CreateColumns();       
     view.GridView.SetBinding(DataGrid.ItemsSourceProperty, new Binding("DisplayRows")); 
    } 

下面的代碼我用來在刷新菜單調用點擊:

private void OnRefreshClick(object sender, RoutedEventArgs e) 
    { 
     var data = new TestDataAccess(); 
     DataSource = data.MakeGridModel("select Top 200 * from ApplicationUSer"); //Assigning DataSource Again, which will call the above method. 
     GridView.UpdateLayout(); 
    } 

所附的圖像可以幫助理解這個問題,刷新後,你可以看到在做水平滾動時列對齊去陌生。需要幫助解決這個奇怪的問題。

嘗試使用GridColumnWidth = 0,並重新設置爲自動,嘗試GridView.UpdateLayout(), ![在這裏輸入的形象描述] [1]

回答

1

我解決了上述問題我自己。我使用BindingOperations.ClearBinding(view.GridView,DataGrid.ItemSourceProperty) - 它只清除了ItemSource,這樣我就可以通過Items.Clear()爲每次綁定數據時重新獲得內存(而不是BindingOperations.ClearAllBindings 。

由於ClearAllBindings,其清零頭面板綁定也,故其失去ParentTemplate.Width屬性,因爲那奇怪的問題,水平滾動時happend。