OnInitialize и OnActivate не вызываются на дочерние модели просмотра
Я ожидал, что дочерние модели просмотра, наследующие с экрана, будут участвовать в жизненном цикле родительского экрана. Однако, похоже, это не так. Например:
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? }
}
Возможно ли, чтобы дочерний экран участвовал в родительском жизненном цикле экрана?
Ответы
Ответ 1
Похоже, что это поведение не по умолчанию, и родительскому слову должно быть предложено "провести" модели просмотра детей с использованием метода ConductWith
, как показано ниже:
public class ParentViewModel : Screen
{
public ChildViewModel Child { get; set; }
public ParentViewModel(ChildViewModel childViewModel)
{
this.Child = childViewModel;
Child.ConductWith(this);
}
}
Это гарантирует, что ChildViewModel будет инициализирован, активирован и деактивирован одновременно с родителем. Метод ActivateWith
может использоваться, если вам нужно только инициализировать/активировать ребенка.
Ответ 2
Другой вариант - сделать родительский тип Conductor и сделать дочерний элемент активным.
Ответ 3
Другим решением является использование
protected override void OnViewAttached(object view, object context)
вместо OnActivated()