mvvm caliburn.micro

mvvm - OnInitialize y OnActivate no se invocan en los modelos de vista infantil



caliburn.micro (3)

Esperé que el niño View Models que hereda de Screen participe en el ciclo de vida de la pantalla principal. Sin embargo, parece que este no es el caso. Por ejemplo:

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 que un niño Screen participe en el ciclo de vida de la pantalla principal?


La otra opción es hacer que el padre sea un tipo de Conductor y hacer que el niño sea el elemento activo.


Parece que este comportamiento no es por defecto y se le debe decir al padre que ''conduzca'' modelos de vista secundarios usando 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 garantiza que ChildViewModel se inicialice, active y desactive al mismo tiempo que el padre. El método ActivateWith se puede usar si solo necesita inicializar / activar al niño.


Otra solución es usar

protected override void OnViewAttached(object view, object context)

en lugar de OnActivated ()