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