"Object reference not set to an instance of an object" 在具有实时整形的 PresentationFramework 中

"Object reference not set to an instance of an object" in PresentationFramework with Live Shaping

我在 LifeShaping 过滤的 PresentationFramework 中得到一个空引用:

堆栈跟踪没有给我太多线索:

   at System.Windows.Data.ListCollectionView.RestoreLiveShaping()
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.DispatcherOperation.InvokeImpl()
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at MS.Internal.CulturePreservingExecutionContext.Run(CulturePreservingExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Windows.Threading.DispatcherOperation.Invoke()
   at System.Windows.Threading.Dispatcher.ProcessQueue()
   at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
   at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
   at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
   at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
   at System.Windows.Window.ShowHelper(Object booleanBox)
   at System.Windows.Window.ShowDialog()
   at MVVMSeaCores.AppWindowManager.ShowDialog(Object rootModel, Object context, IDictionary`2 settings)

最后一行是对话框调用,显示包含绑定到 ShowOnGraph 的复选框的 UX。

我正在这样设置实时整形,基于布尔值 属性 "ShowOnGraph":

        KPIBarsView = new CollectionViewSource { Source = KPIBars }.View;
        KPIBarsView.Filter = FilterBars;

        //grouping
        if (KPIBarsView != null && KPIBarsView.CanGroup == true)
        {
            KPIBarsView.GroupDescriptions.Clear();
            KPIBarsView.GroupDescriptions.Add(new PropertyGroupDescription("KPIViewModel.ContextViewModel"));
        }

        //Live Filtering
        ICollectionViewLiveShaping KPIBarsViewLiveShaping = KPIBarsView as ICollectionViewLiveShaping;
        if (KPIBarsViewLiveShaping.CanChangeLiveFiltering)
        {
            KPIBarsViewLiveShaping.LiveFilteringProperties.Add("ShowOnGraph");
            KPIBarsViewLiveShaping.IsLiveFiltering = true;
        }

ShowOnGraph 设置为 false 时,项目按照我的预期进行过滤。但是,一旦我尝试使用 ShowOnGraph=true 取消过滤任何内容,我就会收到此异常。

这不是 "What's a null reference exception" 的副本。 我知道空引用异常是什么。但在这种情况下,空引用在 Presentation Framework 中,在 System.Windows.Data 中。我不知道什么是 null,为什么(列表不包含任何 null 条目,过滤器 属性 是 bool,不能为 null)。

空对象不在我的代码中,我无法对其进行调试。我在调试器中得到的只是发生这种情况时在调度中的位置。在一种情况下,它位于包含我将其设置为 true 的列表的对话框中:

没有空值。

我就做一个按钮,设置一个ShowOnGraph=false,看看哪里出现了异常。

编辑:是的,它发生了 "nowhere"。只是在空白 "Break mode" 页面上打开,没有任何内容或错误发生位置的指示。

我建议您将自己设置为从您的解决方案中调试 Microsoft dll

https://msdn.microsoft.com/en-us/library/cc667410.aspx

然后确保您的调试设置检查了所有可能的异常类型,然后当您再次 运行 您的应用程序并中断异常时,您将获得完整的堆栈跟踪,可以帮助您工作出问题了。

找到解决方案!

我是直接创建视图(而不是使用默认视图,因为我有两个从此集合驱动的视图:

KPIBarsView = new CollectionViewSource { Source = KPIBars }.View;

我读完后做了什么:http://social.technet.microsoft.com/wiki/contents/articles/26673.wpf-collectionview-tips.aspx

以及以下 SA 问题:

  • WPF Multiple CollectionView with different filters on same collection
  • WPF CollectionViewSource Multiple Views?

但是,我尝试只创建一个新集合,用相同的项目填充它并使用:

KPIBarsView = CollectionViewSource.GetDefaultView(KPIBars);

解决了问题。希望这对偶然发现它的其他人有所帮助。

johnDisplayClass 的评论很有帮助。

Something that worked for me: was if i also kept a member reference to each new CollectionViewSource as well as its CollectionView. This kept my live shaping and filtering working. Just this alone solved the same null ref that the OP was experiencing.

防止此 null 异常的另一种方法是在 CollectionViewSource 或 CollectionView 被垃圾回收之前将 IsLiveSorting / IsLiveGrouping / IsLiveFiltering 设置为 false。