Этот человек заводит меня в орехи. Проблема возникает только тогда, когда набор данных достаточно велик, чтобы требовать полосы прокрутки, поэтому я настоятельно рекомендую, чтобы виртуализация данных сыграла свою роль в этом. Как вы можете видеть из xaml ниже последнего столбца, определенного для этого datagrid, есть кнопка, видимость которой привязана к логическому свойству «ErrorsPresent» в DataGridCollectionView, который является источником данных для элемента управления. По какой-то причине, неизвестной мне, когда в элемент управления загружен большой набор данных, есть несколько пустых строк с нулевыми значениями в каждом свойстве. Если я прокомментирую последний столбец, сетка и ее данные отображаются правильно, но когда данные строки фактически обрабатываются (как в конвертере), я получаю эту неприятную ошибку в PresentationFramework. Я сожалею, что включил все это, но я хочу продемонстрировать, что все его код Windows:NullReferenceException при привязке свойства к кнопке в Xceed Datagrid
'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 Critical: 0: http://msdn.microsoft.com/TraceCodes/System/ActivityTracing/2004/07/Reliability/Exception/UnhandledUnhandled exceptionAPreII.vshost.exeSystem.NullReferenceException, mscorlib, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089Объект ссылки не установлен в экземпляр объекта. в System.Windows.Data.BindingExpression.TransferValue (Object newValue, Boolean isASubPropertyChange) в System.Windows.Data.BindingExpression.Activate (объект объекта) в System.Windows.Data.BindingExpression.AttachToContext (попытка AttachAttempt) в системе .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.Internal.Data.DataBindEngine.OnLayoutUpdated (Object отправителя, EventArgs е) в System.Windows.ContextLayoutManager.fireLayoutUpdateEvent() в System.Windows.ContextLayoutManager.UpdateLayout() в System.Windows.ContextLayoutManager. U pdateLayoutCallback (Arg объекта) на System.Windows.Media.MediaContext.FireInvokeOnRenderCallbacks() в System.Windows.Media.MediaContext.RenderMessageHandlerCore (Object resizedCompositionTarget) в System.Windows.Media.MediaContext.RenderMessageHandler (Object resizedCompositionTarget) на System.Windows.Threading.ExceptionWrapper.InternalRealCall (Делегирование обратного вызова, Object args, Int32 numArgs) в MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen (источник объекта, метод делегирования, объектные аргументы, Int32 numArgs, делегат catchHandler) в системе. Windows.Threading.Dispatcher.WrappedInvoke (обратный вызов делегата, объекты args, int32 numArgs, делегат catchHandler) в System.Windows.Threading.DispatcherOperation.InvokeImpl() в System.Threading.Exe cutionContext.runTryCode (Object USERDATA) в System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup (TryCode код, CleanupCode backoutCode, объект USERDATA) на System.Threading.ExecutionContext.Run (ExecutionContext ExecutionContext, ContextCallback обратного вызова, объект состояния, логическое ignoreSyncCtx) на System.Threading.ExecutionContext.Run (ExecutionContext ExecutionContext, ContextCallback обратного вызова, состояние объекта) в System.Windows.Threading.DispatcherOperation.Invoke() в System.Windows.Threading.Dispatcher.ProcessQueue() в System.Windows .Threading.Dispatcher.WndProcHook (IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean & amp; обрабатываются) на MS.Win32.HwndWrapper.WndProc (IntPtr HWND, Int32 MSG, IntPtr, IntPtr wParam'а, LPARAM, Boolean & ампер; обрабатываются) в MS.Win32.HwndSubclass.DispatcherCallbackOperation (о) Объект в System.Windows.Threading .ExceptionWrapper.InternalRealCall (обратный вызов делегата, аргументы объекта, Int32 numArgs) в MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen (источник объекта, метод делегирования, объектные аргументы, int32 numArgs, делегат catchHandler) в System.Windows.Threading.Dispatcher.WrappedInvoke (Делегировать обратный вызов, Аргументы объектов, Int32 numArgs, Делегировать catchHandler) в System.Windows.Threading.Dispatcher.InvokeImpl (приоритет DispatcherPriority, тайм-аут TimeSpan, метод делегирования, объектные аргументы, Int32 numArgs) на MS.Win32.HwndSubclass.SubclassWndProc (IntPtr HWND, Int32 тзд, IntPtr WPARAM, IntPtr LPARAM) на MS.Win32.UnsafeNativeMethods.DispatchMessage (МСГ & усилителя; MSG) на System.Windows.Threading.Dispatcher.PushFrameImpl (DispatcherFrame кадр) в System.Windows.Application. RunInter nal (Окно окна) в System.Windows.Application.Run() в APreII.App.Main() в D: \ tfs \ Hermes \ dev \ Hermes5.0 \ src \ UIServices \ APreII \ obj \ Debug \ App .g.cs: линия 0 на System.AppDomain._nExecuteAssembly (RuntimeAssembly сборки, String [] арг) в System.Runtime.Hosting.ApplicationActivator.CreateInstance (activationContext activationContext, String [] activationCustomData) в Microsoft.VisualStudio.HostingProcess .HostProc.RunUsersAssemblyDebugInZone() на System.Threading.ExecutionContext.Run (ExecutionContext ExecutionContext, ContextCallback обратного вызова, состояние объекта, Boolean ignoreSyncCtx) в System.Threading.ExecutionContext.Run (ExecutionContext ExecutionContext, ContextCallback обратного вызова, объект состояния) в системе .Threading.ThreadHelper.ThreadStart () System.NullReferenceException: Ссылка на объект не установлена в экземпляр объекта. в System.Windows.Data.BindingExpression.TransferValue (Object новое_значение, Boolean isASubPropertyChange) в System.Windows.Data.BindingExpression.Activate (пункт Object) в 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 (Arg объекта) на MS.Internal.Data.DataBindEngine.OnLayoutUpdated (Object отправителя, EventArgs е) в System.Windows.ContextLayoutManager.fireLayoutUpdateEvent() в System.Windows.ContextLayoutManager.UpdateLayout() в Syste m.Windows.ContextLayoutManager.UpdateLayoutCallback (Arg объекта) на System.Windows.Media.MediaContext.FireInvokeOnRenderCallbacks() в System.Windows.Media.MediaContext.RenderMessageHandlerCore (Object resizedCompositionTarget) в System.Windows.Media.MediaContext.RenderMessageHandler (Объект resizedCompositionTarget) в System.Windows.Threading.ExceptionWrapper.InternalRealCall (Делегирование обратного вызова, Object args, Int32 numArgs) в MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen (источник объекта, метод делегирования, объектные аргументы, Int32 numArgs, делегат catchHandler) в System.Windows.Threading.Dispatcher.WrappedInvoke (обратный вызов делегата, объекты args, int32 numArgs, делегат catchHandler) в System.Windows.Threading.DispatcherOperation.InvokeImpl() на System.Threading.ExecutionContext.runTryCode (Объект USERDATA) в System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup (TryCode код, CleanupCode backoutCode, объект USERDATA) на System.Threading.ExecutionContext.Run (ExecutionContext ExecutionContext, ContextCallback обратного вызова, состояние объекта, булева ignoreSyncCtx) на System.Threading.ExecutionContext.Run (ExecutionContext ExecutionContext, ContextCallback обратного вызова, состояние объекта) на System.Windows.Threading.DispatcherOperation.Invoke() в System.Windows.Threading.Dispatcher.ProcessQueue () в System.Windows.Threading.Dispatcher.WndProcHook (IntPtr HWND, Int32 тзд, IntPtr WPARAM, IntPtr LPARAM, булева & усилителя; обрабатываются) на MS.Win32.HwndWrapper.WndProc (IntPtr HWND, Int32 MSG, IntPtr, IntPtr wParam'а, LPARAM, Boolean & ампер; обрабатываются) на MS.Win32.HwndSubclass.DispatcherCallbackOperation (Object o) в System.Windows.Threading.ExceptionWrapper.InternalRealCall (Делегирование обратного вызова, Object args, Int32 numArgs) в MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen (объект-источник, метод делегирования, Object args, Int32 numArgs, Delegate catchHandler) в System.Windows.Threading.Dispatcher.WrappedInvoke (Делегирование обратного вызова, Object args, Int32 numArgs, Delegate catchHandler) в System.Windows.Threading.Dispatcher.InvokeImpl (приоритет DispatcherPriority, тайм-аут TimeSpan , Делегат меня ThOD, объект арг, Int32 numArgs) на MS.Win32.HwndSubclass.SubclassWndProc (IntPtr HWND, Int32 MSG, IntPtr, IntPtr wParam'а, LPARAM) в MS.Win32.UnsafeNativeMethods.DispatchMessage (MSG & усилителя; MSG) на System.Windows.Threading.Dispatcher.PushFrameImpl (DispatcherFrame кадр) в System.Windows.Application.RunInternal (окно) Окно в System.Windows.Application.Run() в APreII.App.Main() в D: \ tfs \ Hermes \ dev \ Hermes5.0 \ src \ UIServices \ APreII \ obj \ Debug \ App.g.cs: строка 0 в System.AppDomain._nExecuteAssembly (сборка RuntimeAssembly, String [] args) at System.Runtime.Hosting.ApplicationActivator.CreateInstance (ActivationContext activationContext, String [] activationCustomData) на Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone() в System.Threading.ExecutionContext.Run (ExecutionContext ExecutionContext, ContextCallback обратного вызова, объект состояния, Boolean ignoreSyncCtx) в системе. Threading.ExecutionContext.Run (ExecutionContext executeContext, ContextCallback callback, состояние объекта) at System.Threading.ThreadHelper.ThreadStart()
Xaml. Как вы можете видеть, у меня есть TRIED, чтобы отключить виртуализацию, установив свойства 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 Visibility.