我正在尝试使用 Xceed ( http://wpftoolkit.codeplex.com/ ) 提供的扩展 WPF 工具包社区版中提供的优秀 DataGrid。我有一个应用程序,它在一个简单的 DataGridControl 对象中显示报告的结果。用户可以从报告列表中选择报告,并且数据网格使用与报告关联的 DataTable 动态更新。每个 Report 的 DataTable 中的列在名称和数量上都可能不同。使用 WPF 中的默认控件,使用常规 MVVM 数据绑定可以正常工作。这也适用于 Xceed 的 DataGridControl,除非使用列对数据进行排序或分组。
发生的情况是,当对列进行排序或分组,并且 DataTable 更新为其中不包含该列的列时,DataGridControl 会引发 ArgumentException,说明正在排序的列不存在。这是一个示例异常:
System.ArgumentException 未处理
Message='' 类型没有名为 'SAP_MATERIAL_NUMBER' 的属性,因此无法对数据集合进行排序。
Source=PresentationFramework StackTrace:在 System.Windows.Data.BindingListCollectionView.ConvertSortDescriptionCollection(SortDescriptionCollection sorts) 上 System.Windows.Data.BindingListCollectionView.RefreshOverride() 在 System.Windows.Data.CollectionView.Refresh() 在 System.Windows.Data。 CollectionView.EndDefer() 在 System.Windows.Data.CollectionView.DeferHelper.Dispose() 在 System.Windows.Controls.ItemCollection.SetCollectionView(CollectionView 视图) 在 System.Windows.Controls.ItemCollection.SetItemsSource(IEnumerable 值) 在 System。 Windows.Controls.ItemsControl.OnItemsSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) ...
这是我当前定义和绑定控件的 XAML:
<xcdg:DataGridControl
Grid.Row="2"
AutoCreateColumns="True"
AutoRemoveColumnsAndDetailConfigurations="True"
ReadOnly="True"
x:Name="xceedReportResult"
ItemsSource="{Binding SelectedReport.Report.Result}"
FontSize="11">
<xcdg:DataGridControl.View>
<xcdg:TableflowView
ShowRowSelectorPane="False"
IsAnimatedColumnReorderingEnabled="True"
HorizontalGridLineBrush="LightGray"
VerticalGridLineBrush="LightGray"
IsAlternatingRowStyleEnabled="True"
ShowScrollTip="False">
<xcdg:TableflowView.Theme>
<xcdg:ClassicSystemColorTheme />
</xcdg:TableflowView.Theme>
</xcdg:TableflowView>
</xcdg:DataGridControl.View>
</xcdg:DataGridControl>
...根据 Xceed 论坛的一些建议,我尝试在选择新报告时运行以下代码以清除任何 SortDescriptions 或 GroupDescriptions,但这不起作用:
ICollectionView source = xceedReportResult.ItemsSource as DataGridCollectionView;
if (source != null)
{
if (source.SortDescriptions != null)
{
source.SortDescriptions.Clear();
}
if (source.GroupDescriptions != null)
{
source.GroupDescriptions.Clear();
}
}
有没有人以这种方式使用过这个数据网格,并找到了解决这个问题的方法?