2012-11-06 17 views
5

Pytanie dotyczące wzorca MVVM, w którym myślę, że mam problem.Przekazywanie obiektu do viewmodel

Gdy wystąpi zdarzenie przyłożenie w widoku Chcę popup wiadomość tj .:

private void marker_TouchDown(MessageObject msgData) 
{ 
    CustomMessageControl message = new CustomMessageControl() {Width = 610, Height = 332}; 
    CustomMessageViewModel messageVM = new CustomMessageViewModel(msgData); 
    message.DataContext = messageVM; 
    //Add to canvas 
} 

Moje ViewModel:

public class CustomMessageViewModel 
{ 
    public MessageObject message { get; set; } 

    public CustomMessageViewModel(MessageObject message) 
    { 
     this.MessageObject = message; 
    } 
} 

To działa, ale nie czuje się dobrze. Czy jest to dopuszczalny sposób wypełniania modelu widoku?

+0

Ogólnie viewmodels będzie używać interfejsu INPC (http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx) do obsługi powiadamiania widoku/konsumenta, że ​​właściwości zostały zaktualizowane. Odradzam ponowne umieszczanie datakontekstu w kodzie na nowy model widoku po dołączeniu w tym scenariuszu. –

+0

Dzięki Quinton, rozumiem użycie INPC. Być może patrzę na to zbyt dosłownie, ale tutaj ktoś klika widok i chcę uruchomić nowy widok przekazujący dane związane z klikanym punktem. –

+1

Przepraszam, że przeglądam kod, robisz to, co jest ogólnie uważane za poprawne, może nie wygląda tak pięknie w kodzie, ale jest standardowym sposobem tworzenia i przekazywania danych do viewmodelu, istnieje kilka frameworków MVVM, które pomagają złagodzić ten problem w swoim projekcie, który może Cię zainteresować, ale jeśli chcesz obsłużyć to wszystko ręcznie, to jest ogólnie przyjęte podejście. –

Odpowiedz

2

Uważam, że naruszasz MVVM w tworzeniu kontroli w modelu widoku. To nie jest testowalne, twój model widoku ma, aby utworzyć kontrolę teraz i nie powinno być wymogiem do testowania (uwydatnia to brak oddzielenia problemów między interfejsem a modelem widoku).

Zamiast tworzyć sterowanie, jest całkowicie dopuszczalne, aby model widoku uruchamiał własne zdarzenie. W tym przypadku, można by zdać widoku modelu, który chcesz okno/nakładka/kontrola wiążą się, coś takiego:

public class CustomMessageControlEventArgs : EventArgs 
{ 
    public CustomMessageViewModel CustomMessageViewModel { get; set; } 
} 

public event EventHandler<CustomMessageControlEventArgs> 
    ShowCustomMessageControl; 

private void marker_TouchDown(MessageObject msgData) 
{ 
    // Create the view model. 
    var message = ...; 

    // Get the events. 
    var events = ShowCustomMessageControl; 

    // Fire. 
    if (events != null) events(this, 
     new CustomMessageControlEventArgs { 
      MessageObject = new CustomMessageViewModel(msgData) 
     }); 
} 

Następnie w kodzie UI, by powiązać ze zdarzeniem, a następnie pokaż odpowiedni interfejs użytkownika dla tego wydarzenia.

Pamiętaj, że MVVM nie polega wyłącznie na możliwości deklarowania wszystkiego w XAML lub danych wiążących do interfejsu użytkownika poprzez tylko wiązań danych, chodzi o właściwe oddzielenie kodu.

Chcesz oddzielić co co jest wyświetlane (model view) z jak co jest wyświetlane (UI); podczas wystrzeliwania wydarzenia utrzymujesz oddzielenie obaw.

Tak, będziesz musiał napisać jakiś kod (lub możesz to zrobić poprzez zmiany w powiadomieniach o nieruchomościach, ale jest to brzydsze, szczerze mówiąc), ale zachowuje separację i pozwala na łatwą testowalność bez konieczności wnoszenia jakiegokolwiek użytkownika elementy interfejsu.

Powiązane problemy