I expected that child View Models inheriting from Screen would participate in the Parent Screen's life-cycle. However, it appears this is not the case. For example:
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? }
}
Is it possible to have a child Screen participate in the parent Screen's life-cycle?
It seems this behaviour is not by default and the parent has to be told to 'conduct' child View Models using the ConductWith
method, as follows:
public class ParentViewModel : Screen
{
public ChildViewModel Child { get; set; }
public ParentViewModel(ChildViewModel childViewModel)
{
this.Child = childViewModel;
Child.ConductWith(this);
}
}
This ensures the ChildViewModel will be initialized, activated and deactivated at the same time as the parent. The ActivateWith
method can be used if you only need to initialize/activate the child.
The other option is to make the parent a Conductor type and make the child the active item.
Other solution is to use
protected override void OnViewAttached(object view, object context)
instead of OnActivated()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With