dedlfix: MVVM

Beitrag lesen

Tach!

danke. Ich habe MVVMLight installiert. Das Menu funktioniert auch gut. Aber:

  1. die zwei Instanzen von RelayCommand funktionieren nicht so:

Alternativ-Text Alternativ-Text

Du machst da was nicht richtig.

Es sei denn, man ändert auch die RealayCommand-Kalsse.

Hast du den Code von RelayCommand aus dem Artikel genommen? Wenn ja, dann solltest du den löschen und GalaSoft.MvvmLight.CommandWpf einbinden. Da ist das richtige RelayCommand drin.

Wie kann man an dieser Stelle mehrere ViewModels registrieren? Das Beispiel tut dies in App-Klass:

        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);

            MainWindow app = new MainWindow();
            ProductViewModel context = new ProductViewModel();
            app.DataContext = context;
            app.Show();
        }

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.

Oder darf man da nur ein ViewModel besitzen, was ich mir schwer vorstellen kann.

Du darft so viele besitzen, wie du magst. Aber jedes WPF-Element hat nur einen DataContext, an den man ein ViewModel üblicherweise bindet. Dazu brauchst du Grundlagenwissen zum DataContext und wie der sich in der Hierarchie der Elemente im XAML vererbt.

In aller Regel wirst du pro View genau ein ViewModel verwenden wollen. Zumindest für nicht allzu komplexe Szenarien. Das bindest du dann an den DataContext vom Haupt-Element in der View. An die anderen Elemente vererbt sich das, wenn du den DataContext nicht individuell überschreibst.

Ein Beispiel für ein solches Überschreiben ist das DataTemplate einer ListBox oder ItemsControl. Da wird der DataContext der einzelnen Elemente auf das jeweilge Element der übergebenen ItemsSource gesetzt (macht das Element von selbst). Du bindest nur die ItemsSource an eine Eigenschaft deines ViewModels, das eine ObservableCollection ist.

Ich fand eine StackOverflow-Frage, in deren ersten beiden Antworten zusammen mit dem Code in der Frage beispielhaft zu sehen ist, wie man das macht: http://stackoverflow.com/questions/18119900/wpf-listbox-bind-itemssource-with-mvvm-light

Nach der Installation sind zwei Klassen ind das Projekt hinzugefügt: MainViewModel und ViewModelLocator. Müssen sie an dieser Stelle angefasst werden?

Schau mal da rein, da sind Kommentare drin, wie man die verwendet. MainViewModel ist ein Gerüst für ein ViewModel. Das kannst du verwenden, kannst es aber auch ignorieren oder löschen. Aber dann fehlt dir ein Beispiel, wie man ViewModels für den MVVM-Light-Weg erstellt und verwendet. 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. Wenn du das so machst, musst oder besser gesagt kannst du allerdings auf das händische Setzen des DataContextes so wie im Beispiel des Artikels verzichten.

dedlfix.