OnInitialize 和 OnActivate 不会在子视图模型上调用

Posted

技术标签:

【中文标题】OnInitialize 和 OnActivate 不会在子视图模型上调用【英文标题】:OnInitialize and OnActivate are not called on child View Models 【发布时间】: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 的生命周期?

【问题讨论】:

【参考方案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()

【讨论】:

以上是关于OnInitialize 和 OnActivate 不会在子视图模型上调用的主要内容,如果未能解决你的问题,请参考以下文章

WTL 没有 CDialog 怎么办

js刷新页面

Prism 中的 DialogWindow 不显示我的窗口

delphi软件启动的顺序解密。

object鼠标点击事件

SWIG 将 const unsigned char example[] 包装到 Java byte[] 作为参数