2013-09-24 25 views
8

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:

  1. Jeśli moja aplikacja ma kilka ViewModels, że wszystkie z nich być przechowywane jako członkowie wewnątrz App.xaml.cs plików?

  2. 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?

Odpowiedz

9

Istnieje wiele różnych podejść do tworzenia instancji ViewModels. Niektóre z nich będą tworzyć wszystkie podczas uruchamiania, a inne nie będą tworzyć instancji ViewModel, dopóki nie będą potrzebne.

W następnym poście znajdziesz kilka możliwych podejść do instancji ViewModel:

MVVM Instantiation Approaches

Odpowiadając na pytania; 1.- Zgodnie z twoim podejściem musiałbyś zdefiniować członków dla wszystkich twoich ViewModels w twoim pliku App.xaml.cs. 2.- Możesz zastosować podejście, które nie tworzy instancji ViewModel, dopóki nie będzie potrzebne.

Istnieje kilka zestawów narzędzi, takich jak MVVM Light lub Caliburn Micro, które ułatwiają implementację wzorca MVVM. Osobiście używam MVVM Light Toolkit, która wykorzystuje podejście Locator. Korzystając z tego zestawu narzędzi, ViewModels są ładowane domyślnie, ale można ustawić, aby załadować określony ViewModel przy uruchomieniu, co może być przydatne w niektórych scenariuszach.

+0

Ś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

+0

Myślę, że jedną z opcji byłoby wdrożenie IDisposable w ViewModel i usunięcie go podczas opuszczania widoku. – anderZubi

+0

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. –