Laden...

Statusleiste funktioniert nach Umstellung auf MVVM nicht

Erstellt von vita85 vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.963 Views
V
vita85 Themenstarter:in
20 Beiträge seit 2011
vor 12 Jahren
Statusleiste funktioniert nach Umstellung auf MVVM nicht

Hallo. Nach den gestrigen Problemen und der damit zusammenhängenden Lösungsfindung habe ich mich dazu entschlossen mein aktuelles Projekt komplett über den Haufen zu werfen und neu aufzusetzen. Diesmal alles gut lesbar, strukturiert und vor allem vorher durchgeplant. Also sprich: ich habe neu angefangen, aber diesmal nach dem MVVM-Pattern.

Nachdem ich nun Ordner für View, Model und ViewModel erstellt habe und einiges an Code getippt habe, musste ich feststellen, dass meine Statusleiste (mal wieder 😦 ) nicht funktioniert. Ich denke es hängt damit zusammen, dass der DataContext nicht richtig erkannt wird, aber nach einigem, erfolglosem durchprobieren komme ich zu keiner funktionierenden Lösung.

Das MainWindow.xaml befindet sich im Ordner "View" (habe es vom Standard Projektordner verschoben).
Meine App.xaml.cs sieht folgendermaßen aus:


using System.Windows;
using BBS_EMC_v2.ViewModel;

namespace BBS_EMC_v2 {
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : Application {
        protected override void OnStartup(StartupEventArgs e) {
            base.OnStartup(e);

            MainWindow window = new MainWindow();
            ViewModelStatusleiste VMStatusLeiste = new ViewModelStatusleiste();

            window.statusbar1.DataContext = VMStatusLeiste;

            window.Show();
        }
    }
}

Füge ich testweise alles in den Konstruktor der MainWindow.xaml.cs ein, läuft es.

Hat jemand von euch vielleicht eine Idee?

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo vita85,

  
window.statusbar1.DataContext = VMStatusLeiste;  
  

dadurch verletzt du aber die Kapselung. Die Statusbar sollte nur im MainWindow bekannt sein und sonst nirgends. Den DataContext für die Statusbar (wie immer die auch aussehen mag) kannst du ja in XAML per Binding angegeben.

Im Titel steht die Anwendung startet nicht, im Text gehts um was anderes. Worum gehts jetzt genau? Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 3, 5.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

109 Beiträge seit 2011
vor 12 Jahren

Hallo,

was funktioniert denn nicht genau? Wird die Statusleiste nicht angezeigt?

Ich will jetzt nichts falsches sagen aber so wie du die Sachen instanziierst und zuweist ist es mindestens unschön. Die App.xaml.cs ist genauso eine Code-Behind-Datei und sollte deshalb nach MVVM weitgehend leer bleiben. Du solltest in deinem MainWindowViewModel die ViewModelStatusleiste instanziieren. Da StatusleisteView ein Element des MainViews ist brauchst du den DataContext nicht explizit angeben, der wird über das DataTemplate automatisch gesetzt (wenn du den DataContext natürlich im MainView auf das MainWindowViewModel gesetzt hast).

Ich hoffe ich habe dich jetzt nicht allzusehr verwirrt 😃

Um Rekursion zu verstehen, muss man erst mal Rekursion verstehen, muss man erst mal Rekursion verstehen, ....

V
vita85 Themenstarter:in
20 Beiträge seit 2011
vor 12 Jahren

Titel geändert. Danke für den Hinweis. Hatte irgendwie noch was anderes im Kopf, als ich das getippt habe.

Zum Thema: Ok, also den Datacontext, der zu Komponenten im MainWindow gehört, trag ich dann auch im Konstruktor des MainWindow ein?
Das klingt auf Anhieb zwar logisch, aber ich meine mal gelesen zu haben, dass die Code-behind Dateien, die an den Views hängen immer leer sind.

Datenkontext im Konstruktor des Mainwindow funktioniert jedenfalls. Danke schonmal.

Edit: In der Statusleiste ist ein Label. Das wird nicht geändert, wenn ich den Datenkontext versuche in der App.xaml.cs zu setzen. Setze ich den Datenkontext in MainWindow.xaml.cs (im Konstruktor), dann gehts.

109 Beiträge seit 2011
vor 12 Jahren

Zum Thema: Ok, also den Datacontext, der zu Komponenten im MainWindow gehört, trag ich dann auch im Konstruktor des MainWindow ein?
Das klingt auf Anhieb zwar logisch, aber ich meine mal gelesen zu haben, dass die Code-behind Dateien, die an den Views hängen immer leer sind.

Du kannst den DataContext auch in der MainWindow.xaml setzen:

    <Window.DataContext>
        <ViewModels:MainWindowViewModel/>
    </Window.DataContext>

Um Rekursion zu verstehen, muss man erst mal Rekursion verstehen, muss man erst mal Rekursion verstehen, ....

V
vita85 Themenstarter:in
20 Beiträge seit 2011
vor 12 Jahren

Ich hab mehrere Datacontexts fürs MainWindow, weil einer zu gigantisch werden würde... Habe mal ein Bild in den Anhang gepackt, damit du dir ein Bild von der GUI machen kannst.

Ich wollte ein ViewModel für die Statusleiste, eines für die Menüleiste und ein ViewModel pro Tabitem.

P
660 Beiträge seit 2008
vor 12 Jahren

Also wenn ich mir das so ansehe würde ich mal behaupten dass MEF für dich interessant sein könnte

MfG
ProGamer*Der Sinn Des Lebens Ist Es, Den Sinn Des Lebens Zu Finden! *"Wenn Unrecht zu Recht wird dann wird Widerstand zur Pflicht." *"Ignorance simplifies ANY problem." *"Stoppt die Piraterie der Musikindustrie"

109 Beiträge seit 2011
vor 12 Jahren

Da die ViewModel aber alles Elemente deines MainViewModels sind und die Views alle auf deinem MainView liegen ist der DataContext derselbe.

Um Rekursion zu verstehen, muss man erst mal Rekursion verstehen, muss man erst mal Rekursion verstehen, ....

V
vita85 Themenstarter:in
20 Beiträge seit 2011
vor 12 Jahren

Also wenn ich mir das so ansehe würde ich mal behaupten dass
>
für dich interessant sein könnte

Ich hab keine Zeit mehr noch großartig viel zeit fürs lernen zu "verschwenden". Dies ist mein IHK Abschlussprojekt, ich hab nur noch 5 Wochen Zeit und es geht auch so nur schleppend voran. Da kann ich leider keine Zeit erübrigen mir noch auf eigene Faust ein Framework beizubringen 😕. Wenn ich alles abgegeben habe, dann gern. Werde dann so oder so noch Feinheiten justieren müssen.

V
vita85 Themenstarter:in
20 Beiträge seit 2011
vor 12 Jahren

Du kannst den DataContext auch in der MainWindow.xaml setzen:

    <Window.DataContext>  
        <ViewModels:MainWindowViewModel/>  
    </Window.DataContext>  

Ok, habe ich jetzt so gemacht (hat was gedauert, weil ich noch mit meinem Chef reden musste). Danke dir.
Also habe ich es richtig verstanden, dass die Codebehind-Dateien nach Möglichkeit leer bleiben sollten.
Das macht es für mich jetzt dann erstmal was schwerer die "umfangreicheren" Methoden - wie zum Beispiel die Verbindung zu einem Server (siehe Menüleiste) - zu implementieren.

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo vita85,

dass die Codebehind-Dateien nach Möglichkeit leer bleiben sollten.

Am wichtigsten ist die Trennung von Darstellung und Logik. Alles was Darstellung, also UI, ist entspricht der View und hier sollte kein Code für die Logik des Programms untergebracht sein. Insofern sollte die Codebehind leer bleiben.
Allerdings ist es sehr wohl i.O. wenn in der Codebehind nur UI-Code vorhanden ist, obwohl sich dies meist mit XAML eleganter lösen lässt.

Das macht es für mich jetzt dann erstmal was schwerer die "umfangreicheren" Methoden - wie zum Beispiel die Verbindung zu einem Server (siehe Menüleiste) - zu implementieren.

Wenn du MVVM und insbesondere Datenbindung konsequent durchziehst ist mMn auf jedenfall einfacher. Siehe Data Binding Overview und THE MODEL-VIEW-VIEWMODEL (MVVM) DESIGN PATTERN FOR WPF.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

109 Beiträge seit 2011
vor 12 Jahren

Hier auch noch mal eine 'heiße' Diskussion zu dem Thema leere Codebehind: Ist MVVM ein Muss bei WPF Anwendungen

Zu dem zweiten Punkt kann ich gfoidl nur zustimmen. Da du geschrieben hast das du dein Projekt in Richtung MVVM umgestaltet hast gehe ich mal davon aus das du noch nicht damit fertig bist (oder eben noch nicht richtig verstanden 😉

Um Rekursion zu verstehen, muss man erst mal Rekursion verstehen, muss man erst mal Rekursion verstehen, ....

V
vita85 Themenstarter:in
20 Beiträge seit 2011
vor 12 Jahren

Da du geschrieben hast das du dein Projekt in Richtung MVVM umgestaltet hast gehe ich mal davon aus das du noch nicht damit fertig bist (oder eben noch nicht richtig verstanden 😉

Beides 😄.
Wobei mir das Design mehr Schwierigkeiten bereitet der Code an sich.