OnInitialize和OnActivate在子视图模型上没有被调用

12

我原本以为继承自Screen的子ViewModel会参与到父级Screen的生命周期中,但是事实证明并非如此。例如:

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

子 Screen 是否可以参与父 Screen 的生命周期?

3个回答

22

看起来这种行为不是默认的,父级必须使用 ConductWith 方法告知其要“管理”子视图模型,如下所示:

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

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

        Child.ConductWith(this);
    }
}

这确保了ChildViewModel将与其父ViewModel同时被初始化、激活和停用。如果您只需要初始化/激活子项,则可以使用ActivateWith方法。


3
另一种解决方案是使用。
protected override void OnViewAttached(object view, object context)

使用OnActivated()的替代方法


3
另一种选择是将父元素设为Conductor类型,将子元素设为活动项。

我曾想过这种方案,但似乎让每个父VM成为一个Conductor有些繁琐。尽管如此,这种方法可能仍然有效。为了支持多个子视图模型,需要使用 Conductor<T>.Collection.AllActive - JulianM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接