这个让我发疯。该问题仅在数据网格大到需要滚动条时才会出现,因此我强烈建议数据虚拟化在其中发挥作用。从下面的 xaml 中可以看出,为此数据网格定义的最后一列是一个按钮,其可见性绑定到 DataGridCollectionView 上的布尔“ErrorsPresent”属性,该属性是控件的数据源。出于某种原因,我不知道,当一个大数据集加载到控件中时,会有一些空行,每个属性都有空值。如果我注释掉最后一列,网格及其数据会正确显示,但是当实际处理行的数据时(如在转换器中),我会在 PresentationFramework 中得到这个讨厌的错误。很抱歉将其全部包含在内,但我想证明它的所有 Windows 代码:
'APreII.vshost.exe'(托管 (v4.0.30319)):已加载 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\Accessibility\v4.0_4.0.0.0__b03f5f7f11d50a3a\Accessibility.dll' System.Transactions 关键: 0:http://msdn.microsoft.com/TraceCodes/System/ActivityTracing/2004/07/Reliability/Exception/UnhandledUnhandled exceptionAPreII.vshost.exeSystem.NullReferenceException,mscorlib,版本=4.0.0.0,文化=中性,PublicKeyToken=b77a5c561934e089Object引用未设置为对象的实例。在 System.Windows.Data.BindingExpression.TransferValue(Object newValue, Boolean isASubPropertyChange) 在 System.Windows.Data.BindingExpression.AttachToContext(AttachAttempt 尝试) 在 System.Windows. Data.BindingExpression.MS.Internal.Data.IDataBindEngineClient。System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart()System.NullReferenceException 处的 ContextCallback 回调,对象状态,布尔 ignoreSyncCtx):对象引用未设置为目的。在 System.Windows.Data.BindingExpression.TransferValue(Object newValue, Boolean isASubPropertyChange) 在 System.Windows.Data.BindingExpression.AttachToContext(AttachAttempt 尝试) 在 System.Windows. Data.BindingExpression.MS.Internal.Data.IDataBindEngineClient.AttachToContext(Boolean lastChance) 在 MS.Internal.Data.DataBindEngine.Task.Run(Boolean lastChance) 在 MS.Internal.Data.DataBindEngine.Run(Object arg) 在 MS。内部.Data.DataBindEngine。
Xaml。如您所见,我已尝试通过设置 CanContentScroll 和 ItemScrollingBehavior 属性来禁用虚拟化,但没有任何效果。:
<XceedDG:DataGridControl Grid.Column="2" x:Name="EncounterDataGrid" ItemsSource="{Binding Path = EncounterDataGridCollectionView, UpdateSourceTrigger=PropertyChanged}"
Background="{x:Static Views:DataGridControlBackgroundBrushes.ElementalBlue}" CellErrorStyle="{StaticResource cell_error}"
FontSize="12" AutoCreateColumns="False" ItemScrollingBehavior="Immediate" ScrollViewer.CanContentScroll="False"
EditTriggers="None" NavigationBehavior="RowOnly" CellEditorDisplayConditions="None" >
<XceedDG:DataGridControl.View>
<Views:TableView ColumnStretchMode="All" ShowRowSelectorPane="False" ScrollViewer.CanContentScroll="False"
ColumnStretchMinWidth="100"/>
</XceedDG:DataGridControl.View>
<!--Group Header formatting-->
<XceedDG:DataGridControl.Resources>
<DataTemplate DataType="{x:Type XceedDG:Group}">
<TextBlock Foreground="DarkSlateBlue"
Padding="3,3,3,3" VerticalAlignment="Center"
FontSize="14" FontWeight="Black" MaxWidth="850" TextWrapping="Wrap"
Text="{Binding Path=., Converter={StaticResource GroupHeaderTextConverterType}}"/>
</DataTemplate>
</XceedDG:DataGridControl.Resources>
<!--Visible column definitions-->
<XceedDG:DataGridControl.Columns>
<XceedDG:Column MinWidth="50"
FieldName="AccountNumber"
Title="Account #"
IsMainColumn="True"
ShowInColumnChooser="False"
TextWrapping="Wrap"
ReadOnly="True"
Visible="True"/>
<XceedDG:Column MinWidth="50"
FieldName="DOB"
Title="Date of Birth"
IsMainColumn="False"
ShowInColumnChooser="False"
TextWrapping="Wrap"
ReadOnly="True"
Visible="True"/>
<XceedDG:Column MinWidth="4"
FieldName="Processed"
Title="Processed"
IsMainColumn="False"
ShowInColumnChooser="False"
TextWrapping="Wrap"
ReadOnly="True"
Visible="True"/>
<XceedDG:Column MinWidth="25"
FieldName="ErrorsPresent"
Title="Errors"
IsMainColumn="False"
ShowInColumnChooser="False"
TextWrapping="Wrap"
ReadOnly="True"
Visible="True" >
<XceedDG:Column.CellContentTemplate>
<DataTemplate>
<Button Command="{StaticResource ShowErrorDialogCommand}" CommandParameter="{Binding Path=DataContext, RelativeSource={RelativeSource AncestorType={x:Type XceedDG:DataRow}}}" Foreground="Red"
Content="View Errors" FontSize="11"
Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type XceedDG:DataRow}}, Converter={StaticResource VisibilityConverterBooleanDataRow}, ConverterParameter=ErrorsPresent}"/>
</DataTemplate>
</XceedDG:Column.CellContentTemplate>
</XceedDG:Column>
</XceedDG:DataGridControl.Columns>
</XceedDG:DataGridControl>
只是为了咯咯笑,我是如何制作 DataGridCollectionView 的:
private void CreateDataGridCollectionView()
{
EncounterDataGridCollectionView = new DataGridCollectionView(Encounters);
EncounterDataGridCollectionView.Filter = new Predicate<object>(IsIncludedPt);
//Group by unit
PropertyGroupDescription groupDescription = new PropertyGroupDescription("UnitID");
EncounterDataGridCollectionView.GroupDescriptions.Add(groupDescription);
}
谢谢你的帮助。我只是不知道如何正确关闭数据虚拟化(如果这是问题的话),如何防止这些空记录(不在底层数据集和 DataGridCollectionView 中)被 CellContentTemplate 可见性转换器处理。