Autor Beitrag
lalan4p
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mo 04.04.11 20:01 
Hallo.

Ich schreibe an einer WPF-Anwendung und nutze dabei Prism und das MVVM-Pattern. Beim Aufrufen der View soll ein DispatcherTimer starten, welcher periodisch Daten aus einer Quelle abfragt und mittels Databinding der View zur Verfügung stellt.
Den Timer hab ich ins ViewModel gepackt und über den Konstrukter des ViewModels wird dieser gestartet.
Nun hab ich aber ein Problem:
Wenn ich die View mit einer anderen ersetze, läuft der Timer weiter. Das will ich aber nicht.
Hab es momentan so gelöst, dass ich im Unloaded-Ereignis der View meinen DataContext in ein ViewModel caste und anschließend die als Public deklarierte Funktion aufrufe um den Timer zu stoppen. Ich denke aber, dass dies gegen das Prinzip des MVVM-Patters verstößt.
Hat einer vielleicht bessere Alternativen? Dachte da zum Beispiel an ein ICommand. Funktioniert auch soweit ganz gut, nur weiß ich nicht, wie ich das über CodeBehind aufrufen kann.

Gruß
Steve
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mo 04.04.11 20:48 
:welcome: in der EE!

user profile iconlalan4p hat folgendes geschrieben Zum zitierten Posting springen:
Hab es momentan so gelöst, dass ich im Unloaded-Ereignis der View meinen DataContext in ein ViewModel caste und anschließend die als Public deklarierte Funktion aufrufe um den Timer zu stoppen. Ich denke aber, dass dies gegen das Prinzip des MVVM-Patters verstößt.
Warum? So ziemlich jedes MVVM-Framework dürfte eine View-Basisklasse bereitstellen, die über ein Interface spezielle Ereignisse an das gebundene VM weitergibt. In deinem Fall würde ich einfach eine Basisklasse bauen, die versucht, Dispose auf dem DataContext aufzurufen.

Generell gibt es für die Weitergabe von View-Events an das VM ohne Code-Behind viele Ansätze, z.B. caliburnmicro.codepl...Title=Documentation.

_________________
>λ=
lalan4p Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Mo 11.04.11 20:24 
Danke für die schnelle Antwort Kha.
Bin leider blutiger Anfänger was WPF angeht.
Wenn ich das richtig verstanden habe, soll ich in der View-Basisklasse eine Funktion Dispose implementieren die sich um alle notwenigen Schritte kümmert. Aber wie ruf ich dann die Funktion auf?

War das also richtig mit dem Casten in der Code-Behind Datei der View?
Gibt es noch irgendwelche andere Möglichkeiten mitzubekommen, wann eine andere View aufgerufen wird?
Hintergrund ist der, dass ich beim Programmstart ein DispatcherTimer starte. Dieser ließt periodisch Meldungen aus einer externen Quelle ein. Wenn eine Bestimmt Meldung eintritt, soll zu einer anderen View (in der gleichen Region) gewechselt werden. Verwende dabei MEF.
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mo 11.04.11 21:09 
user profile iconlalan4p hat folgendes geschrieben Zum zitierten Posting springen:
Wenn ich das richtig verstanden habe, soll ich in der View-Basisklasse eine Funktion Dispose implementieren die sich um alle notwenigen Schritte kümmert.
Nein, du rufst in OnClosed die Dispose-Methode des ViewModels auf. Also im Grunde deine bisherige Lösung, aber zentral für alle Views und ViewModels.

user profile iconlalan4p hat folgendes geschrieben Zum zitierten Posting springen:
Gibt es noch irgendwelche andere Möglichkeiten mitzubekommen, wann eine andere View aufgerufen wird?
Nicht dass ich wüsste. Wenn ich das richtig verstehe, bräuchte der Timer eine Liste der gerade instanzierten ViewModels. Gibt es ein entsprechendes nicht, erzeugt er die zugehörige View, Dispose vom ViewModel trägt dieses dann wieder aus der Liste aus.

_________________
>λ=