myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » GUI: WPF und XAML » WPF mit MVVM Komunikation zwischen zwei ViewModels?
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

WPF mit MVVM Komunikation zwischen zwei ViewModels?

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Heppy Heppy ist männlich
myCSharp.de-Mitglied

Dabei seit: 16.03.2019
Beiträge: 5
Entwicklungsumgebung: Visual Studio 2017
Herkunft: Deutschland


Heppy ist offline

WPF mit MVVM Komunikation zwischen zwei ViewModels?

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo allerseits,
Ich stecke grade in einem Vorgang fest und bin mir nicht sicher wie ich weiter komme vielleicht kann mir jemand mal auf die Sprünge helfen.

In meinem MainWindow befindet sich ein Frame welches mittels Binding eine seite aufruft, was auch ganz gut funktioniert, jetzt mochte ich auf auf der aufgerufenen seite einen Knopf haben welche das Frame vom MainWindow eine andere seite Laden läst.

Main View Klasse

C#-Code:
public class MainViewModel : ViewModelBase
    {
        /// <summary>
        /// Initializes a new instance of the MainViewModel class.
        /// </summary>
        public MainViewModel()
        {
            if (Properties.Settings.Default.ErsterStart)
            {
                FrameUri = ViewModelLocator.EinstellungenSeiteUri;
            }
            else
            {
                FrameUri = ViewModelLocator.AnmeldungSeiteUri;
            }
        }

        public Uri FrameUri { get; set; }
    }

Einstellungen Klasse:

C#-Code:
public class EinstellungenViewModel : ViewModelBase
    {
        public Uri EinstellungenFrameUri { get; set; }
        public List<string> EinstellungKategorie { get; private set; }

        private string _einstellungKategorieAuswahl;
        public RelayCommand Einstellungen_Speichern_Befehl { get; private set; }

        public string EinstellungKategorieAuswahl
        {
            get { return _einstellungKategorieAuswahl; }
            set
            {
                switch (value)
                {
                    case "Datenbank":
                        EinstellungenFrameUri = ViewModelLocator.EinstellungenDatenbankUri;
                        break;
                }
                _einstellungKategorieAuswahl = value;
            }
        }

        public EinstellungenViewModel()
        {
            Einstellungen_Speichern_Befehl = new RelayCommand(Einstellungen_Speichern);
            EinstellungKategorie = new List<string>();
            EinstellungKategorie.Add("Datenbank");
            EinstellungKategorieAuswahl = "Datenbank";
        }

        public void Einstellungen_Speichern()
        {
            Properties.Settings.Default.Save();
            Trace.TraceInformation("Speichern Gedrückt");
        }
    }

Also Kurz gesagt wenn in der Einstellungen Klasse Einstellungen Speichern ausgelöst wird möchte ich das in der Main View Klasse die FrameUri neu Gesetzt wird und die Main UI neu geladen wird mit dem neuen Frame.

Ich hab keinen schimmer wie ich das realisieren soll oder ob es da einen anderen weg gibt oder sogar ein komplett anderer aufbau besser wäre.

Ich wäre für jede hilfe dankbar.
21.03.2019 09:19 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
KroaX KroaX ist männlich
myCSharp.de-Mitglied

avatar-4080.jpg


Dabei seit: 31.08.2009
Beiträge: 284
Herkunft: Köln


KroaX ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Wenn deine Main Komponente eine Referenz auf deine Einstellungskomponente hat ( was allerdings nicht danach aussieht ) könntest du es über ein einfaches Event lösen.

Eine andere Variante, die ähnlich funktioniert, wäre ein Messaging System in deiner Anwendung einzusetzen. Dadurch würde deine Einstellungskomponente eine Nachricht über einen MessageBus senden und deine Main Komponente jegliche Nachrichten dieser Art empfangen und behandeln auch ohne eine direkte Referenz auf die Instanz zu haben. Für einen MessageBus gibt es bereits verschiedene Implementierungen am besten einfach mal danach googlen.

Eine dritte Variante wäre glaub ich auch der Einsatz von MediatR. Ich weiß allerdings nicht ob das in deinem Fall mit Raketen auf Spatzen geschossen ist.

EDIT: Falls du MvvmLight einsetzt -> das Framework hat glaube ich bereits einen internen Messagebus
Falls du Prism nutzt -> Auch da gibt es mWn eine integrierte Pipeline

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von KroaX am 21.03.2019 10:07.

21.03.2019 10:06 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Heppy Heppy ist männlich
myCSharp.de-Mitglied

Dabei seit: 16.03.2019
Beiträge: 5
Entwicklungsumgebung: Visual Studio 2017
Herkunft: Deutschland

Themenstarter Thema begonnen von Heppy

Heppy ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ja aber natürlich ach man ich hab an viel zu komplizierte dinge gedacht und das direkt vor der nase liegende einfach übersehen. Danke vielmals hab es jetzt mit dem Messaging System von MVVM Light gemacht.


Sender:

C#-Code:
MessengerInstance.Send<NotificationMessage<string>>(new NotificationMessage<string>("HAUPTFRAME", "ZURÜCK"));

Empfänger:

C#-Code:
public class MainViewModel : ViewModelBase
    {
        public MainViewModel()
        {
              MessengerInstance.Register<NotificationMessage<string>>(this, NotifyMe);
        }
    }


private void NotifyMe(NotificationMessage<string> obj)
        {
            string notification = obj.Notification;
            string genericValue = obj.Content;
            if(genericValue.Equals("HAUPTFRAME"))
            {
                if(notification.Equals("ZURÜCK"))
                {
                    if(FrameUriAlt == null)
                    {
                        FrameUri = ViewModelLocator.HauptSeiteUri;
                    }
                    else
                    {
                        FrameUri = FrameUriAlt;
                    }
                }
            }
            Trace.TraceInformation(notification + " -> " + genericValue);
        }
21.03.2019 16:46 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
KroaX KroaX ist männlich
myCSharp.de-Mitglied

avatar-4080.jpg


Dabei seit: 31.08.2009
Beiträge: 284
Herkunft: Köln


KroaX ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ich würde die empfehlen mit echten Typen bei den Nachrichten zu arbeiten. Im Optimalen Fall hast du für jede Nachricht einen eigenen Typen.

Mit den Magic Strings wirst du dir auf Dauer keinen Gefallen tun.
21.03.2019 17:54 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 11 Monate.
Der letzte Beitrag ist älter als 11 Monate.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 23.02.2020 01:59