Zrób w viewmodelu eventy:
public delegate void SimpleEventHandler();
public event SimpleEventHandler OpenNewWindow;
public event SimpleEventHandler Close;
dołóż metodę, która będzie sprawdzała czy handler nie jest równy null
:
private void OnSimpleEvent(SimpleEventHandler handler){
if(handler != null) handler();
}
w komendzie zamykającej okno wykonaj tę metodę:
this.OnSimpleEvent(this.Close);
tak samo w otwierającej nowe etc...
teraz w code-behind obsłuż połapany event:
var viewmodel = new WindowViewModel();
viewmodel.Close += () => { this.Close(); };
viewmodel.OpenNewWindow += () => {
var window = new MyWindow();
window.Show();
};
this.Datacontext = viewmodel;
To nieprawda, że code-behind ma być całkowicie pusty. Code-behind to zarządzanie widokiem więc możesz tam odpalać messageboksy czy przechwytywać eventy z viewmodelu i na ich podstawie tworzyć nowe okna czy zamykać inne etc...
Ciekawostka:
Dzięki funkcji sprawdzającej czy dany event nie jest nullem unikniesz wpadek przy unit-testach, bo dajmy na to event odpalający jakiegoś messagebox'a po prostu nie zadziała, a test pójdzie swobodnie dalej. A jeżeli messagebox jest pytający o coś to można zmienić delegata tak żeby nie zwracał void tylko to czego oczekujesz od odpowiedzi w messageboksie - enuma jakiegoś albo coś w tym stylu, generalnie rezultat. :)