2011-07-21 44 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。