sto usando Caliburn.Micro all'interno dell'applicazione WinRTCaliburn.Micro rebind ContentControl su GoBack navigazione
Qui è il mio principale VM:
public class MainViewModel : Conductor<Screen>
{
protected override void OnActivate()
{
if (ActiveItem == null)
{
ActivateItem(
ViewModelLocator.LocateForViewType(typeof(NewsFeedView)) as Screen);
}
base.OnActivate();
}
}
qui io uso conduttore perché voglio caricare diversi controlli in ContentControl, ma ora ho solo questo codice. Ecco il mio controllo dei contenuti in vista principale:
<ContentControl x:Name="ActiveItem" Grid.Column="1" Grid.Row="1" />
Quando si esegue l'applicazione funzionare tutto bene, MainViewModel.Activate
viene chiamato e ActiveItem
insieme a NewsFeedViewModel
e ContentControl
carichi NewsFeedView
.
Il problema:
Se navigando in NewsFeedView
controllo a un altro vista utilizzando NavigationService.NavigateToViewModel
metodo e poi in quella uso vista NavigationService.GoBack
, sto tornando a MainView
e in quel momento in cui viene chiamato MainViewModel.Activate
ActiveItem
non è null
, ma ContentControl.Content
è null
. Ho provato ad usare la proprietà allegata View.Model
per ContentControl
ma non fortuna, come farla ricomporre?
EDIT: Finalmente sto logger di installazione in Caliburn per vedere cosa succede e ho trovato un errore - quando MainView caricato dopo navigationg indietro questi eventi si verificano:
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(...
Anche se non era così informativo Ho usato InteliTrace per ottenere maggiori informazioni e ho ricevuto questo messaggio: "L'elemento è già figlio di un altro elemento". Immagino che NewsFeedView sia stato archiviato da qualche parte e quando arriva il momento di metterlo in ContentControl questa eccezione viene lanciata. Come risolvere questo?
Hai controllato se l'oggetto MainViewModel è ancora la stessa istanza di prima? "L'elemento è già figlio di un altro elemento" sembra che tu stia navigando verso una nuova istanza di MainViewModel, ma quella vecchia è ancora in agguato su NewsFeedViewModel. Puoi condividere la configurazione del tuo bootstrapper? – T045T
Si prega di condividere il bootstrapper. Questo ti dirà quali possibilità hai. Ho risolto un problema simile in uno scenario .net 4.0/wpf. –
@MareInfinitus non c'è bootstrapper nell'app WinRT, MainViewModel registrato come Singleton nel contenitore Caliburn IoC – Alexander