Hallo an alle,
ich habe mal generell die Frage, ob es denn in MVVM möglich ist, ob ein UserControl das PropertyChanged eines anderen UserControls mitbekommen kann, und das ohne Events?
Also um konkreter zu werden ein Beispiel: Ich habe eine UserControl, das ein TreeView enthält. Dieses UserControl befindet sich innerhalb eines anderen UserControls. Jetzt will ich mit dem anderen UserControl darauf reagieren, wenn sich das SelectedItem des TreeViews ändert.
Meine einzige Idee dazu jetzt wäre über Events.
Deshalb meine Frage, gibt es für das MVVM-Pattern da eine spezielle Lösung, das ich irgendwie von außen das PropertyChanged mitbekommen kann, oder müssen da wieder Events her?
Hi,
ich würde jetzt aus dem Bauch heraus sagen, dass das mit InteractionTriggers funktionieren könnte.
Dabei kannst du auf die Events reagieren ohne im CodeBehind etwas machen zu müssen.
Folgender Namespace wäre entsprechend zu setzen:
xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
Die DataTrigger können das auch, vermutlich sogar ein Stück besser.
Da ist egal, wo der Wert herkommt, es braucht nur ein Binding und einen Wert.
Wer [...] kann, ist klar im Vorteil.
lock
Alternative fürasync
/await
: https://github.com/loop8ack/AsyncTicketLock
Danke für die Infos.
Die DataTrigger können das auch, vermutlich sogar ein Stück besser.
Hast du da vielleicht ein Beispiel dafür?
Siehe [Artikel] MVVM und DataBinding, da sind Trigger (auch DataTrigger) erklärt und auch entsprechend referenziert.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Das UserControl ist die View (das "V" in MVVM), und das PropertyChanged-Ereignis gibt es nur im ViewModel (das "VM" in MVVM). Und die View kennt das ViewModel nicht, daher kennt das UserControl auch keine PropertyChanged-Ereignisse!
Das UserControl hat stattdessen DependencyPropertys (bzw. Ereignisse) als öffentliche API. Daran kannst du dann deine ViewModel-Eigenschaften binden, und natürlich auch DependencyPropertys von anderen Controls. Was innerhalb eines UserControls passiert, ist für den Rest der Anwendung völlig irrelevant.
Weeks of programming can save you hours of planning
Und die View kennt das ViewModel nicht
Wie meinen? Müsste das nicht andersherum sein?
Das View bekommt eine Instanz des ViewModels als DataContext und muss daher auch den Typ kennen.
Die DataBindings werden ja auch von der View verwaltet, also kennt es auch die Properties.
Das ViewModel darf die View nicht kennen.
Wer [...] kann, ist klar im Vorteil.
lock
Alternative fürasync
/await
: https://github.com/loop8ack/AsyncTicketLock
War ein bißchen mißverständlich ausgedrückt. Ein UserControl weiß nichts von MVVM oder vom ViewModel. Es kann mit oder ohne ViewModel eingesetzt werden. Deshalb gibt es im UserControl auch einen anderen Mechanismus für die Aktualisierung der Bindings (also DependencyProperties anstatt IPropertyChanged).
Und ein UserControl bekommt auch kein ViewModel als DataContext, sondern es werden Werte (keine ViewModels) an die DependencyProperties gebunden.
Meistens braucht man eh keine UserControls in WPF. Ein Anwendungsfall wäre, wenn es in unterschiedlichen Projekten wiederverwendet werden soll. Und dann muß es auch unabhängig vom verwendeten VM sein. Und bei ReactiveUI werden UserControls als IViewFor<T>
eingesetzt, aber das ist hier nicht relevant. Und für alles andere ist ein Template ausreichend.
Weeks of programming can save you hours of planning
Für sowas verwende ich meist das CustomControl, das sind dann die, die an mehreren Stellen mit mehreren ViewModels verwendet werden können.
Das CustomControl bekommt dann auch sauber definierte DependencyProperties und einen anständigen Style/Template, die mittels TemplateBinding (oder RelativeSource) auf die DPs zugreifen.
Oder ganz normale bereits bekannte Controls mit Styles/Templates, die auf AttachedDependencyProperties zugreifen.
Die UserControls sind bei mir meistens ausgelagerte Teile einer größeren View, sie sind also nicht unabhängig und dürfen dann auch einen DataContext zugewiesen bekommen.
Wirklich brauchen tut man die UserControls dafür nicht, ich nutze sie trotzdem, da komplexe Views in XAML leider schnell sehr unübersichtlich werden. Die UserControls dienen also hauptsächlich dazu, den Code lesbarer zu machen - oder z.B. in Listen, wenn es mehrfach genutzt wird und das gleiche ViewModel dahinter stehen kann/darf/soll.
Ist vielleicht etwas kleinkariert, aber mir ist der Unterschied wichtig ^^
Wer [...] kann, ist klar im Vorteil.
lock
Alternative fürasync
/await
: https://github.com/loop8ack/AsyncTicketLock