WPF DataGrid ItemSsource刷新 - 网格列显示奇怪的行为

时间:2011-07-21 18:01:02

标签: wpf datagrid

我正在开发基于WPF DataGrid的WPF UserControl,以使用我们自己的基于业务的上下文菜单来支持动态列生成。

我创建了名为DataSource的Dependency Property,当我设置DataSource调用自定义方法将我的dataSource绑定到动态创建列并设置ItemSource属性时。一切都很好第一次。我有一个名为Refresh的上下文菜单,当用户单击Refresh时,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,并再次设置为Auto,Tried GridView.UpdateLayout(), ![在此输入图像说明] [1]

1 个答案:

答案 0 :(得分:1)

我自己解决了上述问题。

我使用BindingOperations.ClearBinding(view.GridView,DataGrid.ItemSourceProperty)而不是BindingOperations.ClearAllBindings(),它只清除了ItemSource,这样每次绑定数据时我都可以通过Items.Clear()重新获得内存。

由于ClearAllBindings,它也会清除标题面板绑定,因此它会丢失ParentTemplate.Width属性,因为在水平滚动期间会发生奇怪的问题。