我在 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
取消过滤任何内容,我就会收到此异常。
这不是“什么是空引用异常”的重复。我知道什么是空引用异常。但在本例中,空引用位于演示框架的 System.Windows.Data 中。我不知道什么是 null,为什么(列表不包含任何 null 条目,过滤器属性是 bool 并且不能为 null)。
空对象不在我的代码中,并且无法供我调试。我在调试器中得到的只是发生这种情况时调度中的位置。在一种情况下,它位于包含列表的对话框中,我将其设置为 true:没有什么是空的。
我只需创建一个按钮来设置 ShowOnGraph=false,然后查看异常发生的位置。
编辑:是的,它“无处”发生。只是打开一个空白的“中断模式”页面,没有任何内容或指示错误发生的位置。
对我有用的事情是:如果我还保留对每个新 CollectionViewSource 及其 CollectionView 的成员引用。这使得我的实时整形和过滤工作得以继续进行。仅此一点就解决了OP遇到的相同的空引用。防止此 null 异常的另一种方法是在 CollectionViewSource 或 CollectionView 被垃圾回收之前将 IsLiveSorting / IsLiveGrouping / IsLiveFiltering 设置为 false。
我直接创建视图(而不是使用默认视图,因为我有两个从此集合驱动的视图:
KPIBarsView = new CollectionViewSource { Source = KPIBars }.View;
读完本文后我做了什么:
http://social.technet.microsoft.com/wiki/contents/articles/26673.wpf-collectionview-tips.aspx
以及以下 SA 问题:但是,我尝试创建一个新集合,用相同的项目填充它并使用:
KPIBarsView = CollectionViewSource.GetDefaultView(KPIBars);
解决了问题。希望这对其他偶然发现它的人有帮助。
垃圾收集会导致这个新视图的 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 自行破坏。