2016-05-04 8 views
0

Je suis en train d'écrire un de Windows 8.1 App Store dans C#, MVVM Motif.Parent prévenir ViewModel dans MVVM

J'ai 3 ViewModels: 1. BaseViewModel 2. StudentViewModel 3. StudentDashboardViewModel

Son comme:

  • I ajouté BaseViewModel.
  • J'ai hérité StudentViewModel à partir de BaseViewModel.
  • Puis, j'ai hérité StudentDashboardViewModel de StudentViewModel.

J'ai fait une page StudentDashboardPage et je binded à StudentDashboardViewModel.

Je suis en train de changer un exemple de la propriété, IsBlackIn dans StudentViewModel par une autre classe, mais le problème est qu'il ne soit pas son enfant avise viewmodel StudentDashboardViewModel. Donc, comment notifier le modèle de vue enfant des changements dans le mode de vue parent. Voici le 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()); 
    } 

} 

page StudentDashboardPage derrière le 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

Retour aux principes fondamentaux de MVVM. Pourquoi votre ViewModels singleton en premier lieu? ViewModel est censé être en vie seulement tant que la vue correspondante est affichée et pas pendant toute la durée de vie de l'application. – niksofteng

+0

Je prévois de revenir de singleton mais, qu'en est-il de Notifier le problème? –

+0

Les vues-modèles peuvent survivre à leurs vues et même être partagées par plusieurs vues, mais je suis d'accord qu'elles ne devraient pas être singletons. –

Répondre

2

Il y a 3 façons je peux voir la StudentDashboardViewModel peut être averti de tout changement qui peut se produire à la propriété IsBlackIn définie dans StudentViewModel:

  1. Marque SetProperty<T> (dans BaseViewModel) virtuel et remplacez StudentDashboardViewModel et vérifiez le nom de la propriété.
  2. Définissez le paramètre de la propriété IsBlackIn dans StudentViewModel virtuel et remplacez StudentDashboardViewModel.

Dans les deux cas précédents ne pas oublier d'appeler la méthode de base si c'était SetProperty<T> ou IsBlackIn setter.

La troisième option que vous avez est de composer les modèles de vue (utiliser la composition sur l'héritage). Autrement dit, laissez StudentDashboardViewModel recevoir une instance de StudentViewModel, puis écoutez un événement qui notifie le changement de IsBlackIn. Vous pouvez soit écouter INotifyPropertyChanged.PropertyChanged ou implémenter votre propre événement personnalisé.

+0

Option 3, Option 3! Pour l'amour de toutes choses saintes! – Jamiec