我正在开发基于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]
答案 0 :(得分:1)
我自己解决了上述问题。
我使用BindingOperations.ClearBinding(view.GridView,DataGrid.ItemSourceProperty)而不是BindingOperations.ClearAllBindings(),它只清除了ItemSource,这样每次绑定数据时我都可以通过Items.Clear()重新获得内存。
由于ClearAllBindings,它也会清除标题面板绑定,因此它会丢失ParentTemplate.Width属性,因为在水平滚动期间会发生奇怪的问题。