| Autor |
Beitrag |
UGrohne
      

Beiträge: 5502
Erhaltene Danke: 220
Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
|
Verfasst: Mo 20.02.12 20:53
Hallo zusammen,
ich habe eine MVVM-Anwendung, die auf einem selbst entwickelten Framework basiert. In dem Framework ist z.B. eine Basislistview definiert, die ich meistens für die Tabellenanzeige nutze. Jetzt habe ich folgende Anforderung:
In einer View benötige ich Daten einer anderen Entität zur Filterung. Die View heißt MaterialListViewModel Also dachte ich mir, ich schnapp mir einen ContentPresenter und binde diesen an ein Property vom Typ ArticleListViewModel, das ich sauber initialisiere. Für beide sind DataTemplates definiert, die die FlatListView (XAML) aus dem Framework zur Anzeige nutzen. Einzeln funktionieren die perfekt.
Alle Views laufen in einem TabControl als unterschiedliche Tabs. Ursprünglich basierte das alles auf dem Artikel hier: msdn.microsoft.com/e...gazine/dd419663.aspx.
So, das View zeigt jetzt sauber die Daten, links die Artikelliste, rechts die Materialliste. Bearbeite ich nun einen Artikel/Material oder öffne auf andere Weise ein neues Tab, funktioniert das auch noch. Sobald ich aber zurück zu meinem MaterialListViewModel wechsle, bekomme ich vom Debugger eine Exception präsentiert:
| Zitat: | | Bei dem angegebenen Element handelt es sich bereits um das logische untergeordnete Element eines anderen Elements. Führen Sie zuerst eine Trennung durch. |
Jetzt habe ich bereits von dem Attribut x:Shared gelesen, nur bin ich mir jetzt nicht sicher, wie und wo das angewendet wird. Ich hatte es in verschiedenen Templates, in den DataTemplates und auch im Dictionary versucht, aber nirgends hat es den erwünschten Effekt gebracht, nämlich das neue Instanzen der View erzeugt werden.
Vielleicht kann mir hier jemand auf die Sprünge helfen?
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Mo 20.02.12 21:44
Mit DataTemplates allein dürfte das nicht auftreten, da in ihnen nur eine FrameworkElement Factory gespeichert ist und bei jeder Benutzung diese eine neue Kopie der Elemente erstellt. Da muss an einer Stelle manuell der Visual Tree manipuliert werden, ich schiebe die Schuld einfach mal vorsichtig auf das Framework  . Kannst du im Debugger überprüfen, wann und wo im Tree das Problem auftritt?
_________________ >λ=
|
|
UGrohne 
      

Beiträge: 5502
Erhaltene Danke: 220
Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
|
Verfasst: Mo 20.02.12 22:34
Kannst Du Dich noch an diesen Beitrag erinnern? Deine Klasse darin habe ich auch in dem Framework drin, nur hatte ich sie noch nicht verwendet. Damit funktioniert es nun, auch wenn ich derzeit keine Erklärung habe. Aber ich kann wenigstens mal weiter machen.
Ich befürchte zwar, dass ich damit nur das Symptom bekämpfe, aber vielleicht kannst Du mich da noch erleuchten  .
Übrigens konnte ich den Debugger nicht darauf ansetzen, denn über die Exception bin ich nicht an den Code rangekommen, er zeigt mir nicht mal einen CallStack an.
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Mo 20.02.12 23:13
Hm. Keine Ahnung, wie das helfen kann  .
Das mit dem CallStack ist allerdings merkwürdig. Hat auch das Exception-Objekt selbst keinen  ?
_________________ >λ=
|
|
UGrohne 
      

Beiträge: 5502
Erhaltene Danke: 220
Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
|
Verfasst: Mo 20.02.12 23:17
Das Exception-Objekt hat einen, stimmt:
| Zitat: | bei System.Windows.FrameworkElement.ChangeLogicalParent(DependencyObject newParent)
bei System.Windows.FrameworkElement.AddLogicalChild(Object child)
bei System.Windows.Controls.ContentControl.OnContentChanged(Object oldContent, Object newContent)
bei System.Windows.Controls.ContentControl.OnContentChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
bei System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
bei System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
bei System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args)
bei System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType)
bei System.Windows.DependencyObject.InvalidateProperty(DependencyProperty dp)
bei System.Windows.Data.BindingExpressionBase.Invalidate(Boolean isASubPropertyChange)
bei System.Windows.Data.BindingExpression.TransferValue(Object newValue, Boolean isASubPropertyChange)
bei System.Windows.Data.BindingExpression.Activate(Object item)
bei System.Windows.Data.BindingExpression.AttachToContext(AttachAttempt attempt)
bei System.Windows.Data.BindingExpression.MS.Internal.Data.IDataBindEngineClient.AttachToContext(Boolean lastChance)
bei MS.Internal.Data.DataBindEngine.Task.Run(Boolean lastChance)
bei MS.Internal.Data.DataBindEngine.Run(Object arg)
bei MS.Internal.Data.DataBindEngine.OnLayoutUpdated(Object sender, EventArgs e)
bei System.Windows.ContextLayoutManager.fireLayoutUpdateEvent()
bei System.Windows.ContextLayoutManager.UpdateLayout()
bei System.Windows.UIElement.UpdateLayout()
bei System.Windows.Controls.TabItem.OnPreviewGotKeyboardFocus(KeyboardFocusChangedEventArgs e)
bei System.Windows.UIElement.OnPreviewGotKeyboardFocusThunk(Object sender, KeyboardFocusChangedEventArgs e)
bei System.Windows.Input.KeyboardFocusChangedEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
bei System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
bei System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
bei System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
bei System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
bei System.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args)
bei System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trusted)
bei System.Windows.Input.InputManager.ProcessStagingArea()
bei System.Windows.Input.InputManager.ProcessInput(InputEventArgs input)
bei System.Windows.Input.KeyboardDevice.TryChangeFocus(DependencyObject newFocus, IKeyboardInputProvider keyboardInputProvider, Boolean askOld, Boolean askNew, Boolean forceToNullIfFailed)
bei System.Windows.Input.KeyboardDevice.Focus(DependencyObject focus, Boolean askOld, Boolean askNew, Boolean forceToNullIfFailed)
bei System.Windows.Input.KeyboardDevice.Focus(IInputElement element)
bei System.Windows.UIElement.Focus()
bei System.Windows.Controls.TabItem.SetFocus()
bei System.Windows.Controls.TabItem.OnMouseLeftButtonDown(MouseButtonEventArgs e)
bei System.Windows.UIElement.OnMouseLeftButtonDownThunk(Object sender, MouseButtonEventArgs e)
bei System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
bei System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
bei System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
bei System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
bei System.Windows.UIElement.ReRaiseEventAs(DependencyObject sender, RoutedEventArgs args, RoutedEvent newEvent)
bei System.Windows.UIElement.OnMouseDownThunk(Object sender, MouseButtonEventArgs e)
bei System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
bei System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
bei System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
bei System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
bei System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
bei System.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args)
bei System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trusted)
bei System.Windows.Input.InputManager.ProcessStagingArea()
bei System.Windows.Input.InputManager.ProcessInput(InputEventArgs input)
bei System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport)
bei System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel)
bei System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
bei System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
bei MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
bei MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
bei System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
bei MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
bei System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
bei MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
bei MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
bei System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
bei System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
bei System.Windows.Application.RunDispatcher(Object ignore)
bei System.Windows.Application.RunInternal(Window window)
bei System.Windows.Application.Run(Window window)
bei System.Windows.Application.Run()
bei AptusSolutions.Artikelverwaltung.App.Main() in D:\Dokumente\Visual Studio 2010\Projects\Artikelverwaltung\Artikelverwaltung\obj\x86\Debug\App.g.cs:Zeile 0.
bei System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
bei System.Threading.ThreadHelper.ThreadStart() |
Aber ansonsten sieht das so aus:

Einloggen, um Attachments anzusehen!
|
|
|