2010-04-19 16 views
6

Mam następujące pytanie dotyczące światła MVVM: co "napędza" interfejs użytkownika? Widzę, że mogę mieć ViewModel na widok, który wyświetlam; ViewLocator obsługuje wszystkie ViewModels (do buforowania, jak rozumiem). Ale co napędza interfejs użytkownika?Czy potrzebuję kontrolera widoku dla światła MVVM w Silverlight?

Jeśli mam polecenie zdefiniowane w moim ViewModel, które mówi "ShowDetail"; czy muszę napisać kod do wyświetlania tego widoku wewnątrz ViewModel?

Czy są tego przykłady? Dzięki!

Odpowiedz

1

W MVVM, co "napędza" widok wiąże dane. Możesz połączyć widok z ViewModel, ustawiając DataContext widoku, aby wskazywał na model widoku.

prosty przykład (stosując MVVM światła)

MyViewModel.cs

public class MyViewModel : ViewModelBase 
{ 
    (...) 
    private string _myProperty; 
    public string MyProperty { 
     get { return _myProperty; } 
     set { 
      _myProperty = value; 
      RaisePropertyChanged("MyProperty"); 
     } 
    } 
} 

MyView.xaml.cs

void MyView() { 
    DataContext = new MyViewModel(); 
} 

MyView.xaml

<TextBlock Text="{Binding MyProperty}" /> 
+1

Moje pytania były bardziej związane z ładowaniem różnych widoków. Rozumiem mechanizm wiązania z ViewModel. Ale gdzie mogę napisać kod, aby pokazać nowy widok, gdy użytkownik wykonuje, na przykład przycisk "Pokaż szczegóły"? –

5

MVVM wzór sam w sobie nie ha cokolwiek konkretnego dla nawigacji pomiędzy widokami. Chociaż istnieje wiele rozwiązań w tym zakresie w kilku systemach. Najczęstszym rozwiązaniem jest użycie kontrolera, który "orkiestruje" główny widok, lub stosuje podejście "Master-Detail" dla subviews.

Kilka ciekawych rozwiązań:

1

Stworzyłem szablon T4 tha t generuje kod i pokazuje jak nawigować do uri lub obiektu, lub zamknąć okno (wpf). Współpracuje z MVVM światła

Download here

0

Myślę, że można sprawdzić Cinch V2:

http://www.codeproject.com/KB/WPF/CinchV2_1.aspx

który wydaje cichy obiecujące. Myślę jednak, że większość tych ram jest dość trudna.

Zaimplementowałem rozwiązanie z prostym podejściem MVVM z pewnego rodzaju wzorcem kontrolera nadzorującego, który obsługuje komunikację pomiędzy Widokami i Widokami.

0

Zaleca się odczytywanie w systemie Messaging w zestawie narzędzi MVVM. To chyba najprostsze podejście, jakie udało mi się osiągnąć.Oto przykład, jak to działa:

Jeśli masz 2 Widok modeli - 1 dla klientów poszukujących, drugi do wyświetlania szczegółowych informacji o wybranym klientem:

W pierwszym modelu widoku, masz nieruchomości, takich jak to:

public string CustomerID 
    { 
     get 
     { 
      return _customerid; 
     } 

     set 
     { 
      if (_efolderid == value) 
      { 
       return; 
      } 

      var oldValue = _customerid; 
      _customerid = value; 

      // Update bindings and broadcast change using GalaSoft.MvvmLight.Messenging 
      RaisePropertyChanged("CustomerID", oldValue, value, true); 
     } 
    } 

Następnie, w drugim modelu widoku zarejestrować otrzymywać wiadomości, gdy wartość ta zmienia się od innych, takich jak to:

void registerForMessages() 
    { 
     Messenger.Default.Register<PropertyChangedMessage<string>>(this, 
      (pcm) => 
      { 
       if (pcm.PropertyName == "CustomerID") 
       { 
        customerID = pcm.NewValue; 
        AddWorkplanCommand.RaiseCanExecuteChanged(); 
        loadCustomerDetails(); 
       } 
      }); 
    } 

Be z pewnością wywołaj funkcję registerForMessages() w konstruktorze drugiego modelu widoku. Inną rzeczą, która pomaga, jest stworzenie mapy rodzajów, gdy masz 4 lub więcej modeli ViewModels w swojej aplikacji. Moim zdaniem łatwo jest skonstruować taki plik w pliku tekstowym w rozwiązaniu, aby śledzić wszystkie wiadomości i to, co mają osiągnąć oraz jakie inne modele widoku są zarejestrowane, aby je otrzymać.

Jedną z naprawdę fajnych rzeczy jest to, że masz 1 model wyświetlania, który wysyła powiadomienie o zmianie, takie jak zmieniona właściwość customerID, i od razu otrzymuje 4 inne modele wyświetlania, które otrzymują tę zmianę, a wszystkie same zaczynają ładować zmiany.

Powiązane problemy