我基于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]