2016-05-04 3 views
0

Я пишу для Windows 8.1 App Store, в C#, MVVM Pattern.Уведомить Parent ViewModel в MVVM

У меня есть 3 ViewModels: 1. BaseViewModel 2. StudentViewModel 3. StudentDashboardViewModel

Его, как:

  • Я добавил BaseViewModel.
  • Я унаследовал StudentViewModel от BaseViewModel.
  • Затем унаследовано StudentDashboardViewModel от StudentViewModel.

Я сделал страницу StudentDashboardPage и я переплетен его StudentDashboardViewModel.

Я пытаюсь изменить пример свойства, IsBlackIn в StudentViewModel с помощью другого класса, но проблема в том, что она не уведомляя ее ребенка ViewModel StudentDashboardViewModel.

Итак, как уведомить дочерний режим просмотра изменений в родительской модели. Вот код:

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 страница за код:

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

Назад к основным принципам MVVM. Почему ваш SingleMonels ViewModels на первом месте? Предполагается, что ViewModel жив только до тех пор, пока отображается соответствующий вид, а не на протяжении всего срока службы приложения. – niksofteng

+0

Я планирую вернуться обратно из синглтона, но как насчет проблемы с сообщением? –

+0

View-models могут пережить свои взгляды и даже быть разделены несколькими видами, но я согласен, что они не должны быть одиночными. –

ответ

2

Есть 3 способа я могу видеть StudentDashboardViewModel может получить уведомление о любых изменениях, которые могут произойти в IsBlackIn имущества, определенного в StudentViewModel:

  1. Make SetProperty<T> (в BaseViewModel) виртуальный и переопределить в StudentDashboardViewModel и проверить имя свойства.
  2. Сделать сеттер IsBlackIn недвижимостью в StudentViewModel виртуальным и переопределить в StudentDashboardViewModel.

В двух предыдущих случаях, не забудьте вызвать базовый метод, который был ли SetProperty<T> или IsBlackIn сеттера.

Третий вариант, который у вас есть, состоит в том, чтобы составить модели просмотра (используйте композицию над наследованием). То есть, пусть StudentDashboardViewModel получит экземпляр StudentViewModel, а затем прослушает событие, которое уведомляет об изменении IsBlackIn. Вы можете либо прослушивать INotifyPropertyChanged.PropertyChanged, либо реализовать собственное пользовательское событие.

+0

Вариант 3, вариант 3! Ибо любовь ко всем святым! – Jamiec

Смежные вопросы