2016-08-10 1 views
0

Je suis actuellement aux prises avec un crash dont je ne connais pas vraiment l'origine ou la solution.Élément déjà enfant d'un autre élément - PivotItems

J'ai un ViewModelLocator avec ma machine virtuelle qui a été enregistré dans le constructeur (

ctor { ... SimpleIoc.Default.Register<TabMainViewModel>(); } 
public TabMainViewModel TabMainVm => ServiceLocator.Current.GetInstance<TabMainViewModel>(); 

Ce VML est ensuite utilisé par le XAML en tant que ressource statique

DataContext="{Binding Source={StaticResource ViewModelLocator}, Path=TabMainVm}" 

<Pivot ItemsSource="{Binding PivotItems}"> 

Et le TabMainViewModel ressemble à ceci:

public TabMainViewModel(MenuPivotFactory factory) 
{ 
    PivotItems = new ObservableCollection<PivotItem>(factory.PivotItems); 
} 

public ObservableCollection<PivotItem> PivotItems { get; set; } 

Et l'usine est injectée par le ServiceLocator (également régi STERED) et il vient de créer une liste de

de PivotItem
/*NavigationHelper*/ 
private static readonly IDictionary<Type, Type> ViewModelRouting 
     = new Dictionary<Type, Type> 
     { 
      {typeof(MonitorViewModel), typeof(MonitorView)}, 
      {typeof(RouteViewModel), typeof(RouteView)}, 
      {typeof(MapViewModel), typeof(MapView)} 
     } 
public static Page GetView(Type viewModel) 
    { 
     return (Page)Activator.CreateInstance(ViewModelRouting[viewModel]); 
    } 

/*Factory*/ 
new PivotItem 
    { 
     Header = new TabHeader {Label = "Monitor", Glyph = "\uE121"}, 
     Content = NavigationHelper.GetView(typeof(MonitorViewModel)) 
    }, 

J'espère que cela mon processus de création d'un objet un peu clair.

Maintenant, je peux naviguer entre les différents PivotItems sans problème. Mais quand je m'éloigne, puis j'appuie sur le bouton de retour, parfois ça marche et parfois je suis jeté dans le App.g.i.cs avec l'erreur mentionnée dans le titre: Element est déjà enfant d'un autre élément. Pendant le débogage, j'arrive au point où la vue appelle la méthode get de la propriété VM PivotItems, puis renvoie cette erreur. Donc je suppose que cela a quelque chose à voir avec les Vues dans les PivotItems ou quelque chose comme ça.

Comment puis-je créer les objets correctement afin que cette erreur ne soit pas levée et que je puisse naviguer entre la page de tableau croisé dynamique et les autres pages sans planter?

+0

Êtes-vous l'ajout/suppression des pivots? Ou est-ce toujours le même ensemble? – Depechie

Répondre

0

Je pense que j'ai reproduit votre problème:

enter image description here

Ceci est parce que votre ItemsSouce est une collection de PivotItem contrôle: ObservableCollection<PivotItem>. Lorsque vous revenez au TabMainPage, dans le public ObservableCollection<PivotItem> PivotItems { get; set; }, les mêmes PivotItem s sont ajoutés pour la deuxième fois à Pivot.

Voici une solution, dans la méthode OnNavigatingFrom de TabMainPage:

protected override void OnNavigatingFrom(NavigatingCancelEventArgs e) 
{ 
    this.DataContext = null; 
    base.OnNavigatingFrom(e); 
}