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?
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
:
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.
Tags und Links .net c# winrt-xaml caliburn.micro caliburn