WPF ChildWindow MVVM

Das Model View Viewmodell Pattern schreibt keine bestimmte Implementierung vor. Entsprechend vielfältig sind Lösungswege. Im folgenden Beispiel wird besprochen, wie ein Datensatz in einem Modalen popUp Window editiert werden kann.

Ein Edit XAML Window kann per ShowDialog angezeigt werden.

   1:    private void button2_Click(object sender, RoutedEventArgs e)
   2:          {
   3:              var wnd = new Window1();
   4:              wnd.DataContext = this.DataContext;
   5:              wnd.ShowDialog();
   6:          }

Es gibt nur ein ViewModel, das die Liste als ObservableCollection enthält und ein Property vom Typ Customer, das den selektierten Eintrag der Listview enthält. Das Viewmodel wird ident an das Popup Window per Datacontext zugewiesen.

Das ViewModel enthält außerdem eine Eigenschaft für das Update Command vom Typ ICommand Der Getter verweist auf die interne Update Funktion.

   1:  public ICommand UpdateCustomerCommand { get { return new RelayCommand(UpdateCustomer); } }
   2:   
   3:  public void UpdateCustomer()
   4:          {
   5:              db.SaveChanges();
   6:          }

 

Um den aktuellen Datensatz aus dem Listview dem Property aus dem Dataview zuweisen zu können, kommt im XAML deklarative Bindung zum Einsatz.

   1:  <ListView x:Name="listView"   SelectedItem="{Binding SelectedCustomer,Mode=TwoWay}" 

 

So kann nun im Child Window XAML Code deklarativ jede Textbox an die notwendige Eigenschaft aus dem Customer Objekt gebunden werden.

   1:  <TextBox  Text="{Binding SelectedCustomer.CompanyName}" />
   2:  <TextBox  Text="{Binding SelectedCustomer.CustomerName}" /

Nun muss das Child Window vom Benutzer nach fertigen editiervorgang auch geschlossen werden können, die Liste der Customers bzw. der Eintrag geändert werden können und aus dem Viewmodel die Methode UpdateCustomers aufgerufen werden.

Für all das fügt man einen Button in das Child Window ein. Das Command wird gebunden.

   1:  <Button   Command="{Binding UpdateCustomerCommand}"
   2:                  Click="button_Click"/>

Zusätzlich wird sogenannter Code Behind Code in dem Child Window genutzt um das Rückgabe Objekt zu füllen. Dieses wird DialogResult genannt und kann Objekte jeden Types aufnehmen, also zb auch ein komplettes Customer Objekt. In diesem Fall wird einfach nur true zurück geben.

   1:   private void button_Click(object sender, RoutedEventArgs e)
   2:          {
   3:              this.DialogResult = true;
   4:   
   5:   
   6:          }

Das PopUpChild Fenster kann vom Benutzer auch per X geschlossen werden, was in diesem speziellen Falle wegen fehlenden Command Binding den Datensatz in der Datenbank nicht aktualisiert.

Kommentare sind geschlossen