2011-10-25 5 views
10

. Esperaba que los modelos de vista secundarios heredados de la pantalla participaran en el ciclo de vida de la pantalla principal. Sin embargo, parece que este no es el caso. Por ejemplo:OnInitialize y OnActivate no se invocan en los modelos de vista secundarios

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? } 
} 

¿Es posible tener una pantalla secundaria participan en el ciclo de vida de la pantalla principal?

Respuesta

15

Parece que este comportamiento no es por defecto y el padre tiene que ser dicho que 'conducir' niño Visualización de modelos utilizando el método ConductWith, de la siguiente manera:

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

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

     Child.ConductWith(this); 
    } 
} 

Esto asegura la ChildViewModel será inicializado, activa y desactivado al mismo tiempo que el padre. El método ActivateWith se puede usar si solo necesita inicializar/activar al niño.

2

La otra opción es hacer que el elemento principal sea un tipo Conductor y convertir al elemento secundario en activo.

+0

pensé en esto, pero parece un poco de mano dura para que todos los padres VM de un conductor. Sin embargo, probablemente funcionaría. Para admitir varios modelos de vista secundaria, se debería usar 'Conductor .Collection.AllActive'. – JulianM

0

Otra solución es utilizar

protected override void OnViewAttached(object view, object context) 

en lugar de OnActivated()

Cuestiones relacionadas