2011-01-31 2 views
0

Этот человек заводит меня в орехи. Проблема возникает только тогда, когда набор данных достаточно велик, чтобы требовать полосы прокрутки, поэтому я настоятельно рекомендую, чтобы виртуализация данных сыграла свою роль в этом. Как вы можете видеть из 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.

ответ

0

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

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

     <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> 
Смежные вопросы