Eigene Messagebox erstellen im MVVM-Pattern

  • WPF MVVM
  • .NET 5–6

Es gibt 86 Antworten in diesem Thema. Der letzte Beitrag () ist von kafffee.

    Hallo

    kafffee schrieb:

    dass von einem Dialog aus noch ein weiterer geöffnet wird, und da wird der zuerst geöffnete nicht geschlossen...?

    Das kommt darauf an wie dein Service gebaut ist.
    Hast du denn implementiert das dein Service das kann?
    Ähnlich wie bei meinem nicht-Dialog Service kannst du das realisieren indem du das richtige Fenster anhand seines DataContexts suchst - sprich anhand seines ViewModel.

    Dann kannst du immer ein Bestimmtes Fenster schliessen mit ​service.CloseDialog(Me) oder ​service.CloseDialog(AskUserViewModel).

    kafffee schrieb:

    Die müssten doch eigentlich applikationsweit Gültigkeit finden oder nicht?

    Normalerweise ja. Mehr kann ich ohne Details nicht sagen.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    So nach ner halben Ewigkeit bin ich mal wieder an dieser Sache dran. Hat bissle länger gedauert als veranschlagt, war noch in ner anderen Baustelle unterwegs, sry dafür :)

    Nofear23m schrieb:

    Dann kannst du immer ein Bestimmtes Fenster schliessen mit service.CloseDialog(Me) oder service.CloseDialog(AskUserViewModel).


    Supi habs auf Anhieb hinbekommen. Danke für den Tipp :)

    Nofear23m schrieb:

    Normalerweise ja. Mehr kann ich ohne Details nicht sagen.


    Hab ich auch hinbekommen. :)
    @Nofear23m

    So jetzt muss ich doch noch mal nachhaken:

    Was meinst du mit AskUserViewModel?

    Ich hab dich folgendermassen verstanden. Öffnen mit:

    VB.NET-Quellcode

    1. Dim dialogService = ServiceContainer.GetService(Of IDialogWindowService)
    2. Dim StatusVM = New StatusFensterViewModel
    3. StatusVM.MusikbibliothekAktualisieren()
    4. dialogService.ShowModalDialog("", StatusVM, Me, True, True)


    und dann schliessen mit:
    dialogService.CloseDialog(StatusVM)

    Da kommt bei mir also im DialogWindowService immer der Fehler hier:

    If window.DataContext.GetType Is vm.GetType Then

    System.Windows.FrameworkElement.DataContext.get hat Nothing zurückgegeben.

    Wenn ich Me übergebe, dann funktioniert es...
    Hallo

    Erstmal müssen wir mal klarstellen um was es sich genau handelt. Du hilst dir ja ein IDialogservice herein.

    Ist es denn ein Dialog?
    Denn wenn ich das richtig sehe rufst du CloseDialog vom VM aus auf welches diesen auch öffnet. Wie soll der Code denn dann ausgeführt werden? Geht das Fenster wirklich als Dialog auf kann der Code ja garnicht ausgeführt werden.

    Öffnest du es nicht als Dialog dann geht erstmal hin und benenne deine Klassen und Methodennamen richtig, so verwirrst du dich selbst und alle anderen.

    Dann reden wir weiter wo das Pronlem liegt.

    Grüße
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Nofear23m schrieb:

    Ist es denn ein Dialog?

    Ja.

    Nofear23m schrieb:

    Geht das Fenster wirklich als Dialog auf kann der Code ja garnicht ausgeführt werden.

    Genau. Hab das folgendermassen versucht zu lösen aber das kann ja gar nicht klappen...

    Das aufrufende ViewModel:

    VB.NET-Quellcode

    1. Private StatusVM As StatusFensterViewModel
    2. Private dialogService As IDialogWindowService = ServiceContainer.GetService(Of IDialogWindowService)
    3. Private Sub MusikdatenbankLaden_Execute()
    4. [...]
    5. Dim OKVM = New OKDialogViewModel
    6. OKVM.Meldung = "Du musst zuerst eine Musikdatenbank anlegen. Bitte wähle dazu im folgenden Dialog den Ordner mit deinen MP3-Dateien aus!"
    7. dialogService.ShowModalDialog("", OKVM, Me, True, True)
    8. StatusVM = New StatusFensterViewModel
    9. AddHandler StatusVM.EinlesenFertig, AddressOf MusikdatenbankLadenFertig
    10. dialogService.ShowModalDialog("", StatusVM, Me, True, True)
    11. End Sub
    12. Private Sub MusikdatenbankLadenFertig()
    13. Debug.WriteLine("fertig eingelesen")
    14. dialogService.CloseDialog(StatusVM)
    15. End Sub


    Dann das aufgerufene ViewModel StatusVM:

    VB.NET-Quellcode

    1. Public Event EinlesenFerig()
    2. Public Sub New()
    3. MusikbibliothekAktualisieren()
    4. End Sub
    5. Public Sub MusikbibliothekAktualisieren()
    6. Dim dialogService = ServiceContainer.GetService(Of IDialogWindowService)
    7. [...Einlesen der Daten...] 'wenn fertig, dann:
    8. RaiseEvent EinlesenFertig()
    9. End Sub


    Das Problem scheint ja zu sein, dass zuerst MusikbibliothekAktualisieren komplett ausgeführt wird, bevor der Dialog überhaupt geöffnet wird... Da ist klar, dass kein Dialog zum Schliessen gefunden wird. Aber wie sonst kann man sowas lösen?

    Folgendes soll geschehen: Im StatusVM sollen die Daten eingelesen werden und der Status dessen angezeigt werden, inwieweit das Einlesen der Daten fortgeschritten ist. Und wenn fertig, der Dialog ausgeblendet werden.

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „kafffee“ ()

    Ja, aber wie bereits in meiner letzten Antwort angedeutet. Wenn du einen Dialog öffnest bleibt der Code an der stelle stehen.
    Mach dir ein neues Service welches eben keinen Dialog öffnet sondern ein normales Window.
    Dann klappt es auch.

    Ansonsten wie immer. Minimalprojekt zum nachstellen des Problems erstellen und hochladen.
    Ist auch ne super übungssache.

    Edit: Berichtige mich bitte aber..... das hat ja mittlerweile schon garnix mehr mit ner eigenen Messagebox zu tun.
    Also bitte am besten einen neuen Thread aufmachen.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Nofear23m schrieb:

    Wenn du einen Dialog öffnest bleibt der Code an der stelle stehen.
    Mach dir ein neues Service welches eben keinen Dialog öffnet sondern ein normales Window.
    Dann klappt es auch.


    Jou das dachte ich mir schon, dass das nicht geht so wie ich mir das vorstell. Egal, hab mich jetzt entschlossen dazu, einfach in meinem Dialogfenster noch einen Button zuzufügen, der dann meine Sub startet, so geht es auch... Ein Window zu nehmen wäre in diesem Fall nicht so optimal...