Studiowałem wzorzec MVVM i wprowadzanie go w życie w aplikacji Windows Phone 8, i mam pytanie o najlepsze praktyki dotyczące inicjowania i dostępu do ViewModels w Aplikacja.Windows Phone 8 - MVVM ViewModels i App.xaml.cs
Kiedy tworzę z danymi aplikacji z szablonów WP8 SDK zauważyłem tego kodu w App.xaml.cs file:
public static MainViewModel ViewModel
{
get
{
// Delay creation of the view model until necessary
if (viewModel == null)
viewModel = new MainViewModel();
return viewModel;
}
}
private void Application_Activated(object sender, ActivatedEventArgs e)
{
// Ensure that application state is restored appropriately
if (!App.ViewModel.IsDataLoaded)
{
App.ViewModel.LoadData();
}
}
Z tego co rozumiem, to znaczy, że Klasa App zawiera MainViewModel jako element statyczny, a po uruchomieniu aplikacji ładowany jest ViewModel.
Skoro tak, mam następujące pytania:
Jeśli moja aplikacja ma kilka ViewModels, że wszystkie z nich być przechowywane jako członkowie wewnątrz App.xaml.cs plików?
Jeśli wszystkie dane ViewModel są ładowane w tym samym czasie, w jaki sposób mogę zarządzać pamięcią mojej aplikacji? Czy możliwe jest zwolnienie wszystkich danych ViewModel i załadowanie tylko ViewModel, który jest używany przez mój widok?
Świetna odpowiedź, wielkie dzięki! A referencje też są świetne :) Zastanawiam się, czy przy takim podejściu byłby to najlepszy sposób na usunięcie danych z moich ViewModels, gdybym nie chciał, aby zajmowały zbyt dużo pamięci, gdy nie są używane ? – miguelarcilla
Myślę, że jedną z opcji byłoby wdrożenie IDisposable w ViewModel i usunięcie go podczas opuszczania widoku. – anderZubi
rozwijając odpowiedź andersZubi, lubię stworzyć singleton, który reprezentuje bieżący stan aplikacji i ma właściwość typu Dictionary. Każda strona lub element sterujący, który wymaga modelu widoku, najpierw przegląda słownik, a następnie tworzy go, jeśli jeszcze nie istnieje, i dodaje obiekt viewModel do słownika. Jeśli jest to IDisposable, nie musisz go wyrzucać podczas rozładowywania widoku ... ponieważ masz do niego odniesienie, możesz go wyrzucić na podstawie dowolnych wyzwalaczy (nawet po rozładowaniu widoku), jeśli masz "klucz" dla modelu widoku w słowniku. –