Caliburn.Micro Rebind ContentControl auf Navigation GoBack

9

Ich verwende Caliburn.Micro in der WinRT-Anwendung

Hier ist meine Haupt-VM:

%Vor%

hier verwende ich Leiter, weil ich verschiedene Steuerelemente in ContentControl laden möchte, aber jetzt habe ich nur diesen Code. Hier ist meine Inhaltskontrolle in der Hauptansicht:

%Vor%

Wenn ich die Anwendung starte, funktioniert alles einwandfrei, MainViewModel.Activate wird aufgerufen und ActiveItem wird auf NewsFeedViewModel und ContentControl loads NewsFeedView gesetzt.

Das Problem:

Wenn ich in NewsFeedView control zu einer anderen Ansicht navigiere mit NavigationService.NavigateToViewModel Methode und dann in dieser Ansicht NavigationService.GoBack benutze, komme ich zurück zu MainView und in diesem Moment wenn MainViewModel.Activate aufgerufen wird ActiveItem ist nicht null , aber ContentControl.Content ist null . Ich habe versucht, View.Model angefügte Eigenschaft für ContentControl zu verwenden, aber kein Glück, wie man es wieder binden lässt?

BEARBEITEN: Schließlich bin ich Setup-Logger in Caliburn, um zu sehen, was passiert, und ich fand einen Fehler - wenn MainView nach der Navigation geladen diese Ereignisse auftreten:

%Vor%

Obwohl es nicht so informativ war, habe ich InteliTrace verwendet, um weitere Informationen zu erhalten, und bekam folgende Nachricht: "Element ist bereits Kind eines anderen Elements". Ich nehme an, NewsFeedView irgendwo gespeichert und wenn die Zeit kommt, um es in ContentControl diese Ausnahme geworfen. Wie löst man das?

    
Alexander 21.05.2013, 16:38
quelle

2 Antworten

3

Sie sollten den ersten Ansatz des Betrachtungsmodells übernehmen. Mit anderen Worten: Aktivieren Sie eine Instanz eines Ansichtsmodells, und Caliburn.Micro übernimmt die Position und Bindung der Ansicht für Sie.

Es sieht auch so aus, als ob Sie das Ansichtsmodell zum Beispiel einmal im Konstruktor instanzieren möchten, oder OnInitialise :

%Vor%     
devdigital 21.05.2013 19:01
quelle
1

Initialisiere das Newsfeed-View-Modell nur einmal, wie @devdigital sagt, wahrscheinlich im Konstruktor, und warum nicht Conductor.Collection.OneActive verwenden, da du zu einem bestimmten Zeitpunkt nur ein aktives Item hast, wird es für diese Situationen verwendet könnte dein Problem lösen.

    
Ibrahim Najjar 30.05.2013 17:32
quelle