Announcement

Collapse
No announcement yet.

WPF MVVM Dialoge

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • WPF MVVM Dialoge

    Guten tag,

    ich versuche merade das MVVM Pattern zu verstehen um es im nächsten Projekt umzusetzen. Eine Sache scheint mir hier aber noch nicht ganz klar. Die MSDN Artikel dazu habe ich gelesen. Mir leuchtet das ein, dass man das View und ViewModel als Objekte deklariert und dann dem DatenContext des Views, das ViewModel zu weist. Mal angenommen ich habe eine AddView. Dann würde ich ja im MainView bei einem Button Click durch ein Command in das ViewModel gelangen. Dort müsste ich
    doch das gleiche wieder tun:

    Code:
    MainViewModel.cs
    
    public void ShowAddView()
    {
    
    var addViewModel = new AddViewModel();
    
    var addView = new AddView(){DataContext=addViewModel}
    
    addView.ShowDialog();
    
    }
    In meinem MainViewModel ist ja mir mein Datenobjekt bekannt. muss ich das public member in das viewmodel holen und wenn das Fenster geschlossen wird zurück holen?

    Code:
    MainViewModel.cs
    
    public void ShowAddView()
    {
    
    var addViewModel = new AddViewModel();
    
    addViewModel.dataObjekt = _dataObjekt
    
    var addView = new AddView(){DataContext=addViewModel}
    
    if(addView.ShowDialog())
    {
    _dataObjekt=addViewModel.dataObjekt ;
    }
    
    }
    Die Beispiele auf MSDN sind ja ohne einen weiteren Dialog, die ich bisher gesehen habe, daher ist das für mich noch nicht so richtig eindeutig.

    Hoffe ihr könnt mir helfen.

    mfg daniel

  • #2
    Code:
    public void ShowAddView()
    {
         AddView addView = new AddView(); 
         AddViewModel addViewModel = new AddViewModel();
         addView.DataContext = addViewModel;
         if(addView.ShowDialog() == true) 
         {
             // Dialogeingaben auswerten
         }
    }
    Das reicht.
    Günther

    Comment


    • #3
      Ich denke es kommt immer drauf an wie groß die Anwendung ist Natürlich könnte man auch ein Event auslösen, welches z.B. die Shell entgegen nimmt. Diese sucht dann nach einer passenden View und zeigt diese an.
      Aber wie gesagt das hängt alles von der größe und dem Wiederverwendungsgrad dieses Dialogs ab.

      Comment


      • #4
        mhmm also wäre die schnittstelle um die Daten wieder zu bekommen, dann das ViewModel. Okay ich denke das versteh ich.

        Comment


        • #5
          Du kannst Dir auch mal Prism oder ähnliches anschauen. Das sind Anwendungsframeworks die auf MVVM aufbauen.

          Hier gibt es eine Auflistung über die gängisten MVVM Frameworks:

          http://stackoverflow.com/questions/1...-are-you-using

          Comment


          • #6
            Vielen Dank,

            eine Frage stellt sich mir aber noch, wie kann ich aus dem dem Viewmodel heraus das View schließen?

            Comment


            • #7
              Vielen Dank für die Antwort, ich versuche erst mal MVVM vollständig zu verstehen, bevor ich prism einsetze. Eine Sache zu dem Quellcode:

              Code:
               AddView addView = new AddView(); 
                   AddViewModel addViewModel = new AddViewModel();
                   addView.DataContext = addViewModel;
                   if(addView.ShowDialog() == true) 
                   {
                       // Dialogeingaben auswerten
                   }

              Wenn ich das so mache, wie weiß ich dann wann das Fenster zu gemacht wird. Wenn das Fenster einen Schließen Button hat, dann w3ird ja ein Command ausgelöst, welches im ViewModel verarbeitet wird, wie kann ich von dort das Fenster ab erschließen?

              Ich habe es sogemacht, dass ich im Viemodel ein

              public event eventhandler Closed;

              bereit gestellt habe und das dann im code abfange

              Code:
                  AddView addView = new AddView(); 
                  AddViewModel addViewModel = new AddViewModel();
                  addviewModel.Closed += delegate(object sender, eventargs e){addView.close(); }
                  addView.DataContext = addViewModel;
                  if(addView.ShowDialog() == true) 
                
                  objekt = addviewmodel.DataObjekt;

              das ist ja wahrscheinlich nicht gerade mvvm konform oder?
              Zuletzt editiert von Fanfon; 21.02.2012, 16:46.

              Comment


              • #8
                Code:
                if(addView.ShowDialog() == true)
                Die Methode ShowDialog wartet so lange, bis der Dialog zugemacht wird. Am Ende hast Du ein Ergebnis true, der Benutzer hat eine Auswahl gemacht, oder false, der Benutzer hat abgebrochen.

                Der Button Abbrechen bekommt im XAML IsCancel="True" zugewiesen. Oder in der Click-Methode sagst Du DialogResult=false;

                Beim Ok Button bewirkt in der Click-Methode ein DialogResult=true; dass der Dialog geschlossen wird.
                Günther

                Comment


                • #9
                  Das ist mir ja klar, aber ich bin ja auf MVVM gegangen um den Codebehind leer zu lassen, deswegen wollte ich ja wissen, wie ich aus dem ViewModel das schließen bewirken kann, deswegen habe ich ja im ViewModel das ClosedEvent erstellt, welches ich auslösen um dann in der Parentklasse die das View/Viewmodel aufgerufen hat, abfängt und das Fenster schließt. Aber das ist sicher nicht gerade der beste Weg in MVVM oder? Daher wollte ich gern wissen, was es alternativ gibt.

                  mfg Daniel

                  Comment


                  • #10
                    Stimmt. Das hat mich bis soeben auch immer geärgert.


                    Bis soeben. Jetzt hab ich das hier gefunden:
                    ChildWindow, DialogResult und MVVM
                    kannst Du schon mal ausprobieren und posten, ob es geklappt hat?
                    Günther

                    Comment


                    • #11
                      Guten tag,

                      danke für den Link, ich habe es ausprobiert und es funktioniert. es hat zwar etwas gedauert, bis ich es verstanden habe. aber ansonsten funktioniert es prima. Das ViewModel muss halt nur einen DialogResult vom Typ bool? bereitstellen und in der BehaviorClass muss statt ChildWindow Window geschrieben werden, wenn man im WPF arbeitet. da ja der Dialog ein Window ist, dann funktioniert das ganze. Vielen Dank für die Hilfe, das bringt mich weiter.

                      Mit freundlichen Grüßen

                      Daniel
                      Zuletzt editiert von Fanfon; 24.02.2012, 09:14. Reason: Informationen ergänzt.

                      Comment


                      • #12
                        Was man natürlich machen kann, ist den Code etwas umzuschreiben. Der Code der im Link gepostet war, kann man für Dialog die mit ShowDialog() aufgerufen werden nehmen. Das unten kann man nehmen um Fenster die mit Show() aufgerufen wurden zu beenden. (Was bei mir das HauptView wäre!)


                        Code:
                            private static void DialogResultPropertyChanged(DependencyObject dependencyObject,DependencyPropertyChangedEventArgs e)
                            {
                                var childWindow = dependencyObject as ChildWindow;
                        
                                if (childWindow != null && (e.NewValue as bool? == true))
                        
                        
                                    childWindow.Close();
                        
                            }
                        Mfg Daniel

                        Comment

                        Working...
                        X