WPF代码尝试重新激活已标记为已分离的BindingExpression

时间:2015-02-11 18:04:02

标签: c# wpf binding

我有一个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: 

2 个答案:

答案 0 :(得分:1)

经过很多的调试后,我发现造成错误的原因是" async"绑定图像源属性。解决方案是实现一个辅助对象,如下所述:https://stackoverflow.com/a/2467510/826060

答案 1 :(得分:0)

另一个解决方案是启用“缓存”,这在TabControl示例中显示:http://www.codeproject.com/Articles/460989/WPF-TabControl-Turning-Off-Tab-Virtualization 这是我的解决方案,因为我不想关闭异步。