【问题标题】:OnInitialize and OnActivate are not called on child View ModelsOnInitialize 和 OnActivate 不会在子视图模型上调用
【发布时间】:2011-12-14 16:12:02
【问题描述】:

我希望从 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 的生命周期?

【问题讨论】:

    标签: mvvm caliburn.micro


    【解决方案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 类型并将子项设为活动项。

      【讨论】:

      • 我想到了这个,但是让每个父VM都成为指挥似乎有点过分。尽管如此,它可能会起作用。要支持多个子视图模型,必须使用Conductor<T>.Collection.AllActive
      【解决方案3】:

      其他解决方案是使用

      protected override void OnViewAttached(object view, object context)
      

      而不是 OnActivated()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-27
        • 2015-05-02
        • 1970-01-01
        • 1970-01-01
        • 2014-11-08
        • 1970-01-01
        • 1970-01-01
        • 2018-10-20
        相关资源
        最近更新 更多