2013-05-21 3 views
9

J'utilise Caliburn.Micro au sein de l'application WinRTCaliburn.Micro redéfinissez ContentControl sur GoBack de navigation

Voici ma principale VM:

public class MainViewModel : Conductor<Screen> 
{ 
    protected override void OnActivate() 
    { 
     if (ActiveItem == null) 
     { 
      ActivateItem(
       ViewModelLocator.LocateForViewType(typeof(NewsFeedView)) as Screen); 
     } 

     base.OnActivate(); 
    } 
} 

j'utilise ici conducteur parce que je veux charger des contrôles différents ContentControl, mais maintenant je n'ai que ce code. Voici mon contrôle de contenu en vue principale:

<ContentControl x:Name="ActiveItem" Grid.Column="1" Grid.Row="1" /> 

Quand je l'exécution du tout l'application beau travail, MainViewModel.Activate est appelé et ActiveItem ensemble à NewsFeedViewModel et ContentControl charges NewsFeedView.

Le problème:

Quand je navigue dans NewsFeedView contrôle à un autre point de vue en utilisant la méthode NavigationService.NavigateToViewModel puis dans cette utilisation vue NavigationService.GoBack, je retourne à MainView et en ce moment où MainViewModel.Activate est appelé ActiveItem n'est pas null, mais ContentControl.Content est null. J'ai essayé d'utiliser View.Model propriété attachée pour ContentControl mais pas de chance, comment le faire rebondir?

EDIT: Enfin je suis enregistreur de configuration en Caliburn pour voir ce qui se passe et j'ai trouvé une erreur - quand MainView chargé après navigationg retour ce événements ayant lieu:

Attaching ***.Views.MainView to ***.ViewModels.MainViewModel. 
ViewModel bound on ActiveItem. 
Using cached view for ***.ViewModels.NewsFeedViewModel. 
System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.Exception: Unspecified error 
at Windows.UI.Xaml.Controls.ContentControl.put_Content(Object value) 
... some winRT stack 
at Caliburn.Micro.View.SetContentPropertyCore(... 

Bien qu'il n'a pas été si instructif J'ai utilisé InteliTrace pour obtenir plus d'informations et j'ai reçu ce message: "Element est déjà enfant d'un autre élément". Je suppose que NewsFeedView est stocké quelque part et quand vient le temps de le mettre dans ContentControl cette exception est levée. Comment résoudre ce problème?

+0

Avez-vous vérifié si l'objet MainViewModel est toujours la même instance qu'avant? "Élément est déjà enfant d'un autre élément" ressemble à une nouvelle instance de MainViewModel, mais l'ancienne est toujours présente dans le NewsFeedViewModel. Pouvez-vous partager votre configuration de bootstrapper? – T045T

+0

S'il vous plaît partager votre bootstrapper. Cela permettra de dire quelles sont les possibilités que vous avez. Ont résolu un tel problème dans un scénario .net 4.0/wpf. –

+0

@MareInfinitus il n'y a pas de bootstrapper dans l'application WinRT, MainViewModel enregistré comme Singleton dans Caliburn IoC conteneur – Alexander

Répondre

3

Vous devez adopter la première approche du modèle de vue. En d'autres termes, activer une instance d'un modèle de vue, et Caliburn.Micro fera l'emplacement de la vue et la liaison pour vous.

Il semble aussi que vous voulez simplement instancier le modèle de vue une fois dans le constructeur par exemple, ou OnInitialise:

public MainViewModel() 
{ 
    this.ActivateItem(new NewsFeedViewModel()); 
} 
+0

merci pour une réponse, mais je ne comprends vraiment pas ce que vous entendez par "adopter la première approche du modèle", j'utilise le modèle de vue lorsque j'appelle 'ActivateItem' et quand j'appelle' NavigateToViewModel' lorsque je navigue entre les vues, je n'utilise donc pas la première approche ici – Alexander

+0

Oui, mais à partir du code MainViewModel que vous avez inclus ci-dessus, vous le faites dans un manière très détournée. Vous obtenez le modèle de vue en utilisant ViewModelLocator et le type de vue. Utilisez simplement l'instance de modèle de vue en premier lieu. – devdigital

+0

ok, compris, mais à la fin ceci n'a aucun effet sur la liaison de données, toujours en naviguant de vue, ContentControl est vide malgré que 'ActiveItem' n'est pas nul, j'ai essayé d'appeler' NotifyOfPropertyChange (() => ActiveItem) ' mais toujours le même résultat – Alexander

1

Initialiser le modèle de vue flux de nouvelles qu'une fois que @devdigital dit, probablement dans le constructeur , et pourquoi ne pas utiliser Conductor.Collection.OneActive puisque vous n'avez qu'un seul élément actif à la fois, il est utilisé dans ce cas, cela pourrait résoudre votre problème.

Questions connexes