2011-10-25 9 views
10

親ビューのライフサイクルに参加する子ビューモデルがScreenから継承されると予想しました。しかし、これはそうではないようです。例: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

もう1つのオプションは、親をConductorタイプにして、その子をアクティブなアイテムにすることです。

+0

を使用することです、私はこの考えが、VM導体すべての親を作るために少し重い利きそうです。それにもかかわらず、おそらくうまくいくでしょう。複数の子ビューモデルをサポートするには、 'Conductor .Collection.AllActive'を使用する必要があります。 – JulianM

0

他のソリューションは

protected override void OnViewAttached(object view, object context) 

の代わりに、OnActivated()

関連する問題