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?
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
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. –
@MareInfinitus il n'y a pas de bootstrapper dans l'application WinRT, MainViewModel enregistré comme Singleton dans Caliburn IoC conteneur – Alexander