PresentationFramework 中使用实时整形时“对象引用未设置到对象的实例”

问题描述 投票:0回答:4

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

enter image description here

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

   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
 取消过滤任何内容,我就会收到此异常。

这不是“什么是空引用异常”的重复。我知道什么是空引用异常。但在本例中,空引用位于演示框架的 System.Windows.Data 中。我不知道什么是 null,为什么(列表不包含任何 null 条目,过滤器属性是 bool 并且不能为 null)。

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

enter image description here

没有什么是空的。

我只需创建一个按钮来设置 ShowOnGraph=false,然后查看异常发生的位置。

编辑:是的,它“无处”发生。只是打开一个空白的“中断模式”页面,没有任何内容或指示错误发生的位置。

c# wpf collectionviewsource
4个回答
2
投票
johnDisplayClass 的评论非常有帮助。

对我有用的事情是:如果我还保留对每个新 CollectionViewSource 及其 CollectionView 的成员引用。这使得我的实时整形和过滤工作得以继续进行。仅此一点就解决了OP遇到的相同的空引用。

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


1
投票
找到解决办法了!

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

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

读完本文后我做了什么:

http://social.technet.microsoft.com/wiki/contents/articles/26673.wpf-collectionview-tips.aspx

以及以下 SA 问题:

  • WPF 多个 CollectionView 在同一集合上具有不同的过滤器
  • WPF CollectionViewSource 多个视图?
但是,我尝试创建一个新集合,用相同的项目填充它并使用:

KPIBarsView = CollectionViewSource.GetDefaultView(KPIBars);

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


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

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

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


0
投票
对于那些正在修改基本集合并且无法使用 GetDefaultView(IEnumerable collection) 的人,问题是这个新视图由于某种我还没有弄清楚的原因而被垃圾收集。

垃圾收集会导致这个新视图的 LiveShapingList 变为“null”,因此您的 RestoreLiveShaping() 方法会返回该异常。我遇到了确切的问题,并通过在虚拟机中存储 ICollectionView 的引用来修复它。

internal IEnumerable FetchKPIBarsView(Predicate FilterBars){ if(m_kpiBarsView == null){ m_kpiBarsView = new CollectionViewSource { Source = KPIBars }.View; ICollectionViewLiveShaping KPIBarsViewLiveShaping = KPIBarsView as ICollectionViewLiveShaping; if (KPIBarsViewLiveShaping.CanChangeLiveFiltering) { KPIBarsViewLiveShaping.LiveFilteringProperties.Add("ShowOnGraph"); KPIBarsViewLiveShaping.IsLiveFiltering = true; } } m_kpiBarsView = FilterBars; if(kpiBarsView.CanGroup == true){ kpiBarsView.GroupDescriptions.Clear(); kpiBarsView.GroupDescriptions.Add(new PropertyGroupDescription("KPIViewModel.ContextViewModel")) } }
这可以防止 ICollectionView 的 LiveShapingList 自行破坏。

© www.soinside.com 2019 - 2024. All rights reserved.