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;
}
}
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
Ich plane, von Singleton zurückzusetzen, aber was ist mit Notify Problem? –
View-Modelle können ihre Ansichten überleben und sogar von mehreren Views geteilt werden, aber ich stimme zu, dass sie keine Singletons sein sollten. –