Tach!
Ich sehe da nur ein ViewModel (ProductViewModel), und das wird dem DataContext vom MainWindow zugewiesen. Eine Variable dafür mit app zu benennen ist nicht richtig, denn die Application ist nochmal was anderes als das Haupt-Fenster.
Das ist richtig. Es ist so, weil ich nicht wusste, wie ich das zweite VieModel anbinden soll. Ich habe zwar nur eine View, ich wollte aber nur testen, wie das mit zwei ViewModels geht. Ich habe ein zweites ViewModel namens MenuViewModel angelegt, in dem die Logik vom Menu drin steht.
Mehrere ViewModels in einer View sind kein Problem. "In aller Regel wirst du pro View genau ein ViewModel verwenden wollen. Zumindest für nicht allzu komplexe Szenarien." Das schrub ich gestern, und hier hast du nun einen Fall, in dem das Szenario komplexer wird. Du kannst ja jedem Element einen eigenen DataContext zuweisen. Dein Beispiel mal etwas gekürzt und umgeschrieben:
MainWindow mainWindow = new MainWindow();
mainWindow.DataContext = new ProductViewModel();
mainWindow.Menu.DataContext = new MenuViewModel();
Das MainWindow bekommt das ProductViewModel und das Menu ist Nachfahre von diesem Window und bekommt sein eigenes Viewmodel. "Menu" steht hier für den x:Name des Menu-Elements. Du kannst aber auch ohne x:Name zu vergeben auskommen, wenn du die ViewModels deklarativ zuweist, so wie es im Kommentar von ViewModelBase.cs beschrieben ist. Dann kannst du die Code-Behind-Dateien unbeachtet lassen.
Außerdem ist auch noch was in die App.xaml eingefügt worden. Das brauchst du, um in der View (im XAML-Code) den DataContext so wie in ViewModelLocator.cs im Kommentar beschrieben deklarativ festlegen zu können.
Soweit ich sehen kann, ist bei mir nichte weiteres in App.xaml eingefügt worden.
Der Key Locator, um den ViewModelLocator deklarativ ansprechen zu können? Die eingefügte Zeile ist in der ViewModelLocator.cs dokumentiert.
Wenn das nicht eingefügt wurde, solltest du das noch machen, sonst geht die deklarative Zuweisung an den DataContext nicht.
Wie werden eigentlich die Events gehandhabt, die zur Laufzeit und ohne Benutzeraktivität ausgelöst werden müssen. Z.B. ich möchte an einer Stelle eine Messagebox anzeigen oder eine bestimmte Teil-View in eine bestimmte Stelle einfügen und Anzeigen.
MessageBoxen lassen sich auch aus dem ViewModel heraus aufrufen, genauso wie es im Code-Behind geht. Ob das allerdings guter Stil ist, aus dem ViewModel heraus direkt die Anzeige zu steuern, statt indirekt nur Propertys zu beschreiben, auf deren Änderung die View reagieren kann, darf man bezweifeln, wenn man das mag. Für den Anfang kannst du das aber erstmal so machen.
"Eine Teil-View einfügen", das kommt drauf an. Ein Weg ist, die Teil-View bereits in der View zu haben und über ein Boolean vom ViewModel aus die Sichtbarkeit umzuschalten. Dazu braucht es in der View einen Boolean-zu-Visibility-Konverter. Beispiele dazu findest du recht einfach über eine Suchmaschine, das spar ich mir an dieser Stelle.
Bisher habe ich auch zu allen Aufgabenstellungen eine Lösung gefunden, weil schon irgendwer anderes das Problem hatte. WPF, DataBinding und MVVM gibts ja schon ziemlich lange. Die Chance, dass du auf ein neues Problem stößt, ist ziemlich gering. Dieser Wink mit dem Zaunspfahl soll dich aber nicht davon abhalten bei Verständnisproblem hier nachzufragen.
dedlfix.