2011-10-25 33 views
10

我期望從屏幕繼承的子視圖模型將參與父屏幕的生命週期。但是,似乎並非如此。例如: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? } 
} 

是否有可能有一個子屏幕參與父屏幕的生命週期?

回答

15

看來這種行爲是默認情況下不和父母有被告知使用ConductWith法「開展」子視圖模型,如下:

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

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

     Child.ConductWith(this); 
    } 
} 

這保證了ChildViewModel將被初始化,激活並在與父母同時停用。如果您只需要初始化/激活孩子,則可以使用ActivateWith方法。

2

另一種選擇是使父母成爲Conductor類型並使該孩子成爲活動項目。

+0

我想到了這一點,但它似乎有點重手,以使每一個母VM的導體。儘管如此,它可能會奏效。爲了支持多個子視圖模型,必須使用'Conductor .Collection.AllActive'。 – JulianM

0

其他解決方案是使用

protected override void OnViewAttached(object view, object context) 

代替OnActivated()