Hej, zabrałem się za ogarnianie otwierania nowych okien w MVVM bez pomocy frameworków, co by lepiej zrozumieć mechanikę i się nieco podszkolić.
W tym celu utworzyłem WindowService, który zaczerpnąłem z SO, choć nieco w nim pozmieniałem, gdzie zamiast generycznej klasy mamy generyczną metodę:
//https://stackoverflow.com/a/36642835
public class WindowService: IWindowService
{
private IContainer _container;
public void ShowWindow<T>() where T : Window
{
_container = Startup.BootStrap();
_container.Resolve<T>().Show();
}
}
Serwis jest wstrzykiwany do VM, oraz wcześniej rejestrowany w kontenerze IoC. Wykorzystuję go w VM w następujący sposób:
public class MainViewModel : ViewModelBase
{
private readonly IEventAggregator _eventAggregator;
private readonly IWindowService _winService;
public MainViewModel(IEventAggregator eventAggregator, IWindowService winService)
{
_eventAggregator = eventAggregator;
_winService = winService;
}
private void OnUpdateStock(object obj)
{
_winService.ShowWindow<SecondView>();
_eventAggregator.SendMessage<SelectionChangedEvent>(new SelectionChangedEvent("dupa"));
}
}
I tutaj pojawia się moje pytanie, czy wywołując _winService.ShowWindow<SecondView>(); i podając nazwę widoku nie łamiemy zasad MVVM? Modele widoków bodajże nie powinny nic wiedzieć o widokach. Choć w tym wypadku nie jest przypisany do niego widok, a widok otwierany przez niego. Z drugiej strony przy pisaniu testów chyba będzie wygodniej sprawdzić, czy została wywołana metoda .ShowWindow<SecondView>() z nazwą konkretnego widoku.
Co o tym myślicie?