2011-10-25 3 views
10

Mi aspettavo che i modelli di vista figlio ereditati dallo schermo partecipassero al ciclo di vita della schermata padre. Tuttavia, sembra che questo non sia il caso. Ad esempio:OnInitialize e OnActivate non vengono richiamati su child Visualizza Modelli

public class ParentViewModel : Screen 
{ 
    public ChildViewModel Child { get; set; } 

    public ParentViewModel(ChildViewModel childViewModel) 
    { 
     this.Child = childViewModel; 
    } 

    public override void OnInitialize() { // called - as expected } 

    public override void OnActivate() { // called - as expected } 

    public override void OnDeactivate() { // called - as expected } 
} 

public class ChildViewModel : Screen 
{ 
    public override void OnInitialize() { // not called - why? } 

    public override void OnActivate() { // not called - why? } 

    public override void OnDeactivate() { // not called - why? } 
} 

È possibile avere una schermata figlio partecipare al ciclo di vita della schermata madre?

risposta

15

Sembra che questo comportamento non è per impostazione predefinita e il genitore deve essere detto di 'condurre' figlio Visualizza i modelli utilizzando il metodo ConductWith, come segue:

public class ParentViewModel : Screen 
{ 
    public ChildViewModel Child { get; set; } 

    public ParentViewModel(ChildViewModel childViewModel) 
    { 
     this.Child = childViewModel; 

     Child.ConductWith(this); 
    } 
} 

Ciò garantisce la ChildViewModel verrà inizializzata, attivato e disattivato contemporaneamente al genitore. Il metodo ActivateWith può essere utilizzato se è solo necessario inizializzare/attivare il bambino.

2

L'altra opzione è di rendere il genitore un tipo Conductor e rendere il bambino l'elemento attivo.

+0

ho pensato a questo, ma sembra un po 'pesante, consegnato per rendere ogni genitore VM un conduttore. Tuttavia, probabilmente funzionerebbe. Per supportare più modelli di visualizzazione figlio, sarebbe necessario utilizzare 'Conductor .Collection.AllActive'. – JulianM

0

Altra soluzione è quella di utilizzare

protected override void OnViewAttached(object view, object context) 

invece di OnActivated()