2011-10-25 10 views
10

Oczekiwane, że to dziecko Zobacz modele dziedziczące z ekranu będą uczestniczyć w cyklu życia ekranu nadrzędnego. Wydaje się jednak, że tak nie jest. Na przykład:Funkcje OnInitialize i OnActivate nie są wywoływane u dzieci Zobacz modele

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? } 
} 

Czy możliwe jest posiadanie dziecka Ekran może uczestniczyć w cyklu życia rodzica ekranu?

Odpowiedz

15

Wydaje się to zachowanie nie jest domyślnie i rodzic musi być powiedział do „prowadzenia” dziecko Zobacz modele stosując metodę ConductWith, co następuje:

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

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

     Child.ConductWith(this); 
    } 
} 

Zapewnia to ChildViewModel zostanie zainicjowany, aktywowane i dezaktywowane w tym samym czasie, co rodzic. Metoda ActivateWith może być użyta, jeśli potrzebujesz tylko zainicjować/aktywować dziecko.

2

Inną opcją jest uczynienie z rodzica typu Conductor i uczynienie z dziecka aktywnego elementu.

+0

myślałem o tym, ale wydaje się nieco brutalne, aby każdy rodzic VM dyrygentem. Niemniej jednak prawdopodobnie by działało. Aby obsługiwać wiele modeli widoku podrzędnego, należy użyć 'Conductor .Collection.AllActive'. – JulianM

0

Innym rozwiązaniem jest użycie

protected override void OnViewAttached(object view, object context) 

zamiast OnActivated()

Powiązane problemy