我有一个WPF
应用程序,其中不同的用户控件(图像,标签,值转换器)绑定到listview
。因此,当选择列表视图项时,这些控件中将显示其他信息。
一切正常,但每次我尝试非常快地滚动listview
或重复切换所选项时,应用程序崩溃并抛出internal WPF code tried to reactivate a
BindingExpression that was already marked as detached
错误。
原因是什么?如何更详细地调试哪些绑定导致此问题?可能是因为某些网址从某些网址检索到了异步,然后使用值转换器转换为BitmapImage
?
这里有详细信息:
System.InvalidOperationException was unhandled
HResult=-2146233079
Message=Internal error: internal WPF code tried to reactivate a BindingExpression that was already marked as detached.
Source=PresentationFramework
StackTrace:
at System.Windows.Data.BindingExpressionBase.SetStatus(BindingStatusInternal status)
at MS.Internal.Data.ClrBindingWorker.SetStatus(PropertyPathStatus status)
at MS.Internal.Data.ClrBindingWorker.CompleteGetValue(AsyncGetValueRequest request)
at MS.Internal.Data.ClrBindingWorker.OnCompleteGetValueOperation(Object arg)
at MS.Internal.Data.DataBindOperation.Invoke()
at MS.Internal.Data.DataBindEngine.ProcessCrossThreadRequests()
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
at System.Windows.Threading.DispatcherOperation.InvokeImpl()
at System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state)
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 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 MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, 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.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
at System.Windows.Threading.Dispatcher.Run()
at System.Windows.Application.RunDispatcher(Object ignore)
at System.Windows.Application.RunInternal(Window window)
at System.Windows.Application.Run(Window window)
at System.Windows.Application.Run()
at test.App.Main() in c:\bitbucket\desktop-case-cit3\test\obj\Debug\App.g.cs:line 0
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
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 System.Threading.ThreadHelper.ThreadStart()
InnerException:
答案 0 :(得分:1)
经过很多的调试后,我发现造成错误的原因是" async"绑定图像源属性。解决方案是实现一个辅助对象,如下所述:https://stackoverflow.com/a/2467510/826060
答案 1 :(得分:0)
另一个解决方案是启用“缓存”,这在TabControl示例中显示:http://www.codeproject.com/Articles/460989/WPF-TabControl-Turning-Off-Tab-Virtualization 这是我的解决方案,因为我不想关闭异步。