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 不会在子视图模型上调用的主要内容,如果未能解决你的问题,请参考以下文章