Hmm... nie wiem czy troszeczkę nie ma tutaj przerostu formy nad treścią.
Sam robię np. tak:
- Tworzę wewnątrz viewmodelu delegata wraz z eventem, który posłuży do otworzenia okna:
// Dwie poniższe linijki można zastąpić oczywiście `Action` albo `Func`
// w zależności do tego czy np. oczekujemy zwrócenia jakichś wartości etc...
public delegate void ShowAboutWindowEventHandler();
public event ShowAboutWindowEventHandler ShowAboutWindowEvent;
- Załóżmy, że mamy jakiś guzik zbindowany do komendy. Wewnątrz tejże komendy robię tak:
this.ShowAboutWindowEvent?.Invoke()
- Natomiast w code-behind obsługuję to zdarzenie np. wołając nowe okno za pomocją IoC:
public MainWindow(IUnityContainer unityContainer)
{
InitializeComponent();
var viewmodel = DataContext as MainWindowViewModel;
viewmodel.ShowDictionariesWindowAction += () => unityContainer.Resolve<AboutWindow>().ShowDialog();
}
Do zdarzenia, o którym mowa może równie dobrze nie być niczego podpiętego i program się nie wywali. Ot viewmodel dostarcza event'a ale widok może go nawet nie obsłużyć tylko olać. Program się nie wywali.