I recently discovered a bug in version 2.4.0.0 (I guess newer versions are affected as well):
If you start two property grid instances in two windows with different UI Threads, you will get an InvalidOperationException like the following:
```
System.Windows.Markup.XamlParseException occurred
_HResult=-2146233087
_message=Initialization of 'Xceed.Wpf.Toolkit.PropertyGrid.PropertyGrid' threw an exception.
HResult=-2146233087
IsTransient=false
Message=Initialization of 'Xceed.Wpf.Toolkit.PropertyGrid.PropertyGrid' threw an exception.
Source=PresentationFramework
LineNumber=0
LinePosition=0
StackTrace: at System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri)
InnerException: System.InvalidOperationException
_HResult=-2146233079
_message=The calling thread cannot access this object because a different thread owns it.
HResult=-2146233079
IsTransient=false
Message=The calling thread cannot access this object because a different thread owns it.
Source=WindowsBase
StackTrace:
at System.Windows.Threading.DispatcherObject.VerifyAccess()
at System.Windows.SystemResources.FindCachedResource(Object key, Object& resource, Boolean mustReturnDeferredResourceReference)
at System.Windows.SystemResources.FindResourceInternal(Object key, Boolean allowDeferredResourceReference, Boolean mustReturnDeferredResourceReference)
at System.Windows.FrameworkElement.FindResourceInternal(FrameworkElement fe, FrameworkContentElement fce, DependencyProperty dp, Object resourceKey, Object unlinkedParent, Boolean allowDeferredResourceReference, Boolean mustReturnDeferredResourceReference, DependencyObject boundaryElement, Boolean isImplicitStyleLookup, Object& source)
at System.Windows.FrameworkElement.FindResource(Object resourceKey)
at Xceed.Wpf.Toolkit.PropertyGrid.PropertyGrid.UpdateContainerHelper() in z:\Test\PropertyGridTest\ToolkitSrc\Main\Source\ExtendedWPFToolkitSolution\Src\Xceed.Wpf.Toolkit\PropertyGrid\Implementation\PropertyGrid.cs:line 872
at Xceed.Wpf.Toolkit.PropertyGrid.PropertyGrid.EndInit() in z:\Test\PropertyGridTest\ToolkitSrc\Main\Source\ExtendedWPFToolkitSolution\Src\Xceed.Wpf.Toolkit\PropertyGrid\Implementation\PropertyGrid.cs:line 1121
at MS.Internal.Xaml.Runtime.ClrObjectRuntime.InitializationGuard(XamlType xamlType, Object obj, Boolean begin)
InnerException:
```
The root cause is the static readonly member "SelectedObjectAdvancedOptionsMenuKey", which is not properly initialized for every UI Thread. This is done just once, as it is static. Depending on which UI thread accesses this member, it may or may not fail.
I'll attach a demo project which demonstrates the issue.
Comments: ** Comment from web user: AndreasBa **
Hi,
I just tested it with v2.6 - the reported issue still exists!
* I am starting a window in its own UI thread.
* The window contains a propertygrid. At some time I close the window and stop the dispatcher.
* At a later stage I decide to start a new instance of the same window class in new UI Thread (with it's own dispatcher).
* When this window is created, I get the exception reported below
```
exception Details (key=value): (System.Object=) System.InvalidOperationException: The calling thread cannot access this object because a different thread owns it.
at System.Windows.Threading.Dispatcher.VerifyAccess()
at System.Windows.Threading.DispatcherObject.VerifyAccess()
at System.Windows.SystemResources.FindCachedResource(Object key, Object& resource, Boolean mustReturnDeferredResourceReference)
at System.Windows.SystemResources.FindResourceInternal(Object key, Boolean allowDeferredResourceReference, Boolean mustReturnDeferredResourceReference)
at System.Windows.FrameworkElement.FindResourceInternal(FrameworkElement fe, FrameworkContentElement fce, DependencyProperty dp, Object resourceKey, Object unlinkedParent, Boolean allowDeferredResourceReference, Boolean mustReturnDeferredResourceReference, DependencyObject boundaryElement, Boolean isImplicitStyleLookup, Object& source)
at System.Windows.FrameworkElement.FindResource(Object resourceKey)
at Xceed.Wpf.Toolkit.PropertyGrid.PropertyGrid.UpdateContainerHelper() in z:\Test\PropertyGridTest\ToolkitSrc\Main\Source\ExtendedWPFToolkitSolution\Src\Xceed.Wpf.Toolkit\PropertyGrid\Implementation\PropertyGrid.cs:line 888
at Xceed.Wpf.Toolkit.PropertyGrid.PropertyGrid.OnSelectedObjectChanged(Object oldValue, Object newValue) in z:\Test\PropertyGridTest\ToolkitSrc\Main\Source\ExtendedWPFToolkitSolution\Src\Xceed.Wpf.Toolkit\PropertyGrid\Implementation\PropertyGrid.cs:line 452
at Xceed.Wpf.Toolkit.PropertyGrid.PropertyGrid.OnSelectedObjectChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) in z:\Test\PropertyGridTest\ToolkitSrc\Main\Source\ExtendedWPFToolkitSolution\Src\Xceed.Wpf.Toolkit\PropertyGrid\Implementation\PropertyGrid.cs:line 440
at System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
at System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
at Xceed.Wpf.Toolkit.PropertyGrid.PropertyGrid.OnPropertyChanged(DependencyPropertyChangedEventArgs e) in z:\Test\PropertyGridTest\ToolkitSrc\Main\Source\ExtendedWPFToolkitSolution\Src\Xceed.Wpf.Toolkit\PropertyGrid\Implementation\PropertyGrid.cs:line 807
at System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args)
at System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType)
at System.Windows.DependencyObject.InvalidateProperty(DependencyProperty dp, Boolean preserveCurrentValue)
at System.Windows.Data.BindingExpressionBase.Invalidate(Boolean isASubPropertyChange)
at System.Windows.Data.BindingExpression.TransferValue(Object newValue, Boolean isASubPropertyChange)
at System.Windows.Data.BindingExpression.Activate(Object item)
at System.Windows.Data.BindingExpression.AttachToContext(AttachAttempt attempt)
at System.Windows.Data.BindingExpression.MS.Internal.Data.IDataBindEngineClient.AttachToContext(Boolean lastChance)
at MS.Internal.Data.DataBindEngine.Task.Run(Boolean lastChance)
at MS.Internal.Data.DataBindEngine.Run(Object arg)
at MS.Internal.Data.DataBindEngine.OnLayoutUpdated(Object sender, EventArgs e)
at System.Windows.ContextLayoutManager.fireLayoutUpdateEvent()
at System.Windows.ContextLayoutManager.UpdateLayout()
at System.Windows.ContextLayoutManager.UpdateLayoutCallback(Object arg)
at System.Windows.Media.MediaContext.InvokeOnRenderCallback.DoWork()
at System.Windows.Media.MediaContext.FireInvokeOnRenderCallbacks()
at System.Windows.Media.MediaContext.RenderMessageHandlerCore(Object resizedCompositionTarget)
at System.Windows.Media.MediaContext.RenderMessageHandler(Object resizedCompositionTarget)
at System.Windows.Media.MediaContext.Resize(ICompositionTarget resizedCompositionTarget)
at System.Windows.Interop.HwndTarget.OnResize()
at System.Windows.Interop.HwndTarget.HandleMessage(WindowMessage msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Interop.HwndSource.HwndTargetFilterMessage(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)
```
For me it seems like the new property grid in the window is caching some data created by the previous UI thread. I just cannot find out what it is.
Could you probably re-open this issue?