NullReferenceException при привязке свойства к кнопке в Xceed Datagrid - PullRequest
0 голосов
/ 01 февраля 2011

Этот сводит меня с ума. Эта проблема появляется только тогда, когда сетка данных достаточно велика, чтобы требовать полосы прокрутки, поэтому я настоятельно рекомендую, чтобы виртуализация данных сыграла в этом свою роль. Как видно из xaml ниже, последний столбец, определенный для этой сетки данных, представляет собой кнопку, видимость которой связана с логическим свойством «ErrorsPresent» в DataGridCollectionView, который является источником данных для элемента управления. По какой-то причине, неизвестной мне, когда в элемент управления загружается большой набор данных, появляются пустые строки с нулевыми значениями в каждом свойстве. Если я закомментирую последний столбец, сетка и ее данные отображаются правильно, но когда данные строки действительно обрабатываются (как в конвертере), я получаю эту неприятную ошибку в 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, Version = 4.0.0.0, Culture = нейтральный, PublicKeyToken = b77a5c561934e089Объект объекта не задан для экземпляра объекта. в System.Windows.Data.BindingExpression.TransferValue (объект newValue, логическое значение isASubPropertyChange) в System.Windows.Data.BindingExpression.Activate (Элемент объекта) в System.Windows.Data.BindingExpression.AttachToContext (попытка AttachAttempt) в System.Windows.Data.BindingExpression.MS.Internal.Data.IDataBindEngineClient.AttachToContext (Boolean lastChance) в MS.Internal.Data.DataBindEngine.Task.Run (логическое значение lastChance) в MS.Internal.Data.DataBindEngine.Run (объектный аргумент) в MS.Internal.Data.DataBindEngine.OnLayoutUpdated (Отправитель объекта, EventArgs e) в System.Windows.ContextLayoutManager.fireLayoutUpdateEvent () в System.Windows.ContextLayoutManager.UpdateLayout () в System.Windows.ContextLayoutManager.UpdateLayoutCallback (Object 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 (обратный вызов делегата, аргументы объекта, Int32 numArgs) в MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen (Источник объекта, Метод делегата, Аргументы объекта, Int32 numArgs, Делегат catchHandler) в System.Windows.Threading.Dispatcher.WrappedInvoke (обратный вызов делегата, аргументы объекта, int32 numArgs, делегат catchHandler) в System.Windows.Threading.DispatcherOperation.InvokeImpl () в System.Threading.ExecutionContext.runTryCode (объект userData) в System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup (код TryCode, код возврата CleanupCode, объект userData объекта) в System.Threading.ExecutionContext.Run (ExecutionContext executeContext, обратный вызов ContextCallback, состояние объекта, логическое значение ignoreSyncCtx) в System.Threading.ExecutionContext.Run (ExecutionContext executeContext, обратный вызов 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 wParam, IntPtr lParam, Boolean & amp; в MS.Win32.HwndSubclass.DispatcherCallbackOperation (Object o) в 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, метод Delegate, объектные аргументы, int32 numArgs в)MS.Win32.HwndSubclass.SubclassWndProc (IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam) в MS.Win32.UnsafeNativeMethods.DispatchMessage (MSG & msg) в системном хранилище файлов 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 []) в System.Runtime.Hosting.ApplicationActivator.CreateInstance (ActivationContext ActivationContext, String [] активацииCustomData) в Microsoft.VisualStucessProHosting.RunUsersAssemblyDebugInZone () в System.Threading.ExecutionContext.Run (ExecutionContext executeContext, обратный вызов ContextCallback, состояние объекта, логическое ignoreSyncCtx) в System.Threading.ExecutionContext.Run (ExecutionContext executeContext, обратный вызов ContextCallback, состояние объекта) в System.Threading.ThreadHelper.ThceptionStartference ()не установлен для экземпляра объекта.в System.Windows.Data.BindingExpression.TransferValue (Object newValue, Boolean isASubPropertyChange) в System.Windows.Data.BindingExpression.Activate (Item item) в System.Windows.Data.BindingExpression.AttachToContext (попытка AttachAttempt) в System.Windows.Data.BindingExpression.MS.Internal.Data.IDataBindEngineClient.AttachToContext (Boolean lastChance) в MS.Internal.Data.DataBindEngine.Task.Run (логический lastChance) в MS.Internal.Data.DataBindEngine.Run (объектный аргумент в MS).Internal.Data.DataBindEngine.OnLayoutUpdated (Отправитель объекта, EventArgs e) в System.Windows.ContextLayoutManager.fireLayoutUpdateEvent () в System.Windows.ContextLayoutManager.UpdateLayout () в System.Windows.ContextLallTaygategateate System.Windows.Conject.Way.Media.MediaContext.FireInvokeOnRenderCallbacks () в System.Windows.Media.MediaContext.RenderMessageHandlerCore (объект resizedCompositionTarget) в System.Windows.Media.MediaContext.RenderMessageHandler (Object resized) atSystem.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.DispatcherOperation.InvokeImpl () в System.Threading.ExecutionContext.runTryCode (объект userData) в System.RuntimeServices.iler.ExecuteCodeWithGuaranteedCleanup (код TryCode, backoutCode CleanupCode, объект userData) в System.Threading.ExecutionContext.Run (обратный вызов ExecutionContext executeContext, обратный вызов ContextCallback, состояние объекта, логический ignoreSyncCtx) в объектном возврате) в System.Windows.Threading.DispatcherOperation.Invoke () в System.Windows.Threading.Dispatcher.ProcessQueue() в System.Windows.Threading.Dispatcher.WndProcHook (IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean & обрабатываются) в MS.Win32.HwndWrapper.WndProc (IntPtr hwnd, Int32 & lt;обрабатывается в MS.Win32.HwndSubclass.DispatcherCallbackOperation (Object o) в 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 (hwnd IntPtr, макс..UnsafeNativeMethods.DispatchMessage (MSG & msg) в System.Windows.Threading.Dispatcher.PushFrameImpl (фрейм DispatcherFrame) в System.Windows.Application.RunInternal (окно) в System.Windows.Application.Run () в APreII.App.() в 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 активацииContext, String [] активацииCustomData) в Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone () в System.Threading.ExecutionContext.Run (обратный вызов ExecutionContext executeContext, контекстный обратный вызов, состояние объекта, логическое выражение логического преобразования класса.executeContext, обратный вызов ContextCallback, состояние объекта) в 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.

1 Ответ

0 голосов
/ 01 февраля 2011

Я ненавижу отвечать на свой вопрос 1 день спустя, но мы здесь.Вздох.Хотя в XAML для моего конвертерного вызова я получал предок datarow, который я извлек из некоторых документов Xceed, отправляя только конвертер, который мне нужен (просто «Binding»), конвертер, похоже, работает.Я предполагаю, что исходная ошибка была результатом некоторой работы, выполняемой с виртуализацией в другом потоке, отсюда и отсутствие трассировки стека, указывающей на любой мой код.

Это работает:

                        <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 Converter={StaticResource VisibilityConverterBooleanDataRow}}" />
                            </DataTemplate>
                    </XceedDG:Column.CellContentTemplate>
...