2016-05-04 8 views
0

Ich bin ein von Windows 8.1 Store-App in C# zu schreiben, MVVM Muster.Benachrichtigen Eltern Ansichtsmodell in MVVM

Ich habe 3 Viewmodels: 1. BaseViewModel 2. StudentViewModel 3. StudentDashboardViewModel

Es ist wie:

  • Ich habe BaseViewModel.
  • Ich geerbt StudentViewModel von BaseViewModel.
  • Dann erbte ich StudentDashboardViewModel von StudentViewModel.

Ich habe eine Seite StudentDashboardPage und ich binded es StudentDashboardViewModel.

Ich versuche, eine Eigenschaft Beispiel zu ändern, IsBlackIn in StudentViewModel über eine andere Klasse, aber das Problem ist, dass es nicht StudentDashboardViewModel sein Kind Viewmodel benachrichtigen ist.

So, wie Kind Viewmodel Änderungen im übergeordneten Viewmodel benachrichtigt. Hier ist der Code:

BaseViewModel:

public class BaseViewModel : INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 
     protected bool SetProperty<T>(ref T storage, T value, [CallerMemberName] String propertyName = null) 
     { 
      if (Object.Equals(storage, value)) 
      { 
       return false; 
      } 
      storage = value; 
      this.OnPropertyChanged(propertyName); 
      return true; 
     } 
     protected void OnPropertyChanged([CallerMemberName] string propertyName = null) 
     { 
      var eventHandler = this.PropertyChanged; 
      if (eventHandler != null) 
      { 
       eventHandler(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     }    
    } 

StudentViewModel:

public class StudentViewModel : BaseViewModel 
    {  
     private static StudentViewModel studentViewModel;    
     public static StudentViewModel Singleton() 
     { 
      if (studentViewModel == null) 
      { 
       studentViewModel = new StudentViewModel(); 
      } 
      return studentViewModel; 
     } 

     private bool _IsBlackIn = false; 
     public bool IsBlackIn 
     { 
      get { return _IsBlackIn; } 
      set 
      { 
       SetProperty<bool>(ref _IsBlackIn, value);    
      } 
     } 
    } 

StudentDashboardViewModel:

public class StudentDashboardViewModel : StudentViewModel 
{ 
    public static StudentDashboardViewModel studentDashboardViewModel; 

    public static StudentDashboardViewModel GetSingleInstance() 
    { 
     return studentDashboardViewModel ?? (studentDashboardViewModel = new StudentDashboardViewModel()); 
    } 

} 

StudentDashboardPage Seite hinter Code:

public sealed partial class StudentDashboardPage : Page 
{ 
    private StudentDashboardViewModel studentDashvm; 

    public StudentDashboardPage() 
    { 
     this.InitializeComponent();   
     this.Loaded += StudentDashboardPage_Loaded; 
    } 

    private void StudentDashboardPage_Loaded(object sender, RoutedEventArgs e) 
    { 
     this.studentDashvm = StudentDashboardViewModel.GetSingleInstance(); 
     this.DataContext = studentDashvm; 
    } 
} 
+3

Zurück zu den MVVM-Grundlagen. Warum sind Ihre ViewModels Singleton an erster Stelle? ViewModel soll nur so lange am Leben bleiben, wie die entsprechende Ansicht angezeigt wird und nicht während der gesamten Anwendungslebensdauer. – niksofteng

+0

Ich plane, von Singleton zurückzusetzen, aber was ist mit Notify Problem? –

+0

View-Modelle können ihre Ansichten überleben und sogar von mehreren Views geteilt werden, aber ich stimme zu, dass sie keine Singletons sein sollten. –

Antwort

2

Es gibt 3 Möglichkeiten kann ich die StudentDashboardViewModel sehen kann über jede Änderung benachrichtigt, die in StudentViewModel definiert die IsBlackIn Eigenschaft auftreten:

  1. Fabrikat SetProperty<T> (in BaseViewModel) virtuell und überschreiben Sie in und überprüfen Sie den Namen der Eigenschaft.
  2. Machen Sie den Setter der IsBlackIn Eigenschaft in StudentViewModel virtuell und überschreiben Sie in StudentDashboardViewModel.

In den letzten beiden Fällen nicht vergessen die Basismethode zu nennen, ob die SetProperty<T> oder IsBlackIn Setter war.

Die dritte Option besteht darin, die Ansichtsmodelle zu erstellen (Komposition über Vererbung verwenden). Das heißt, lassen Sie eine Instanz von StudentViewModel empfangen und hören Sie dann auf ein Ereignis, das die Änderung von IsBlackIn benachrichtigt. Sie können entweder INotifyPropertyChanged.PropertyChanged hören oder ein eigenes benutzerdefiniertes Ereignis implementieren.

+0

Option 3, Option 3! Für die Liebe aller heiligen Dinge! – Jamiec

Verwandte Themen