Laden...

Eine Listview verschiedene ViewModel WPF<-> MVVM

Erstellt von BeZi vor 8 Jahren Letzter Beitrag vor 8 Jahren 1.210 Views
B
BeZi Themenstarter:in
153 Beiträge seit 2007
vor 8 Jahren
Eine Listview verschiedene ViewModel WPF<-> MVVM

Sali,

ich beginne gerade mich mit WPF und MVVM richtig zu beschäftigen und habe folgende Frage bzw. bräuchte Hilfe.

Ich möchte innerhalb einer ListView verschiedene Objekte ( ViewModels) unterhalb mir anzeigen lassen:

Ich glaube als Analogie könnte man sagen wie in jedem Chat.... Wha..sApp

Da habe ich ja auch Textnachrichten dann mal ein Bild dann mal wieder 2 Textnachrichten und dann vielleicht ein Standortanzeige.

So ich wollte etwas ähnliches (andere Objekte). Ich habe für meine Objekte verschiedene ViewModels. Ich weiss jetzt nur nicht wie ich die am geschicktesten untereinander bringe...

Was nehme ich anstatt einer ListView?

Ich habe Objekt A davon Leitet sich Objekt B (+VieModel) und Objekt C (+ViewModel) ab.

Jetzt habe ich von B und C ViewModels erzeugt. Das bringt mir ja wahrscheinlich nicht allzuviel. für eine Liste, oder ?

Brauche ich für Objekt A auch ein ViewModel ? Und kann dann Irgendwie eine Collection von diesem erzeugen ?

Hmm ich hoffe man versteht was ich will. Bzw. kann mir einer Helfen ?

Merci

Y
102 Beiträge seit 2005
vor 8 Jahren

Hallo,

Wenn du dir die Objekte in einer Liste anzeigen lassen möchtest, dann wäre eine herangehensweise, dass du dir ein ViewModel erstellst das du dann an die View bindest.

In diesem ViewModel stellst du dann ein Property IEnumerable MessageContentxyz zur Verfügung das vom Typ Basisklasse/Interface.

Dieses Property kannst du dann an die ListView binden und mittels Templates und Styling so anpassen, dass es deinen wünschen entspricht.

742 Beiträge seit 2005
vor 8 Jahren

Das Stichwort sidn Template Selectoren: https://msdn.microsoft.com/de-de/library/system.windows.controls.datatemplateselector%28v=vs.110%29.aspx

Einfach Verberbung nutzen und einen Template Selector schreiben

ImageMessageVM : MessageVM
TextMessageVM : MessageVM
VideoMessageVM : MessageVM

Du kannst dann einfach eine ObersableCollection<MessageVM> Message in deinem Haupt-ViewModel definieren.

S
469 Beiträge seit 2007
vor 8 Jahren

Einfacher als mit TemplateSelector gehts wenn man (Default-)DataTemplates für die ViewModels erstellt. Dann wird die Ansicht in der ListView automatisch je nach VM-Type angepasst (auch wenn neue dazukommen muss man nichts weiter machen als ein neues DataTemplate dafür anzulegen).
Mit dem TemplateSelector kann man komplexere Sachen realisieren, da ist man maximal flexiblel, in den meisten (einfachen) Fällen braucht man ihn aber nicht.

gruß
sth_Weird

++++++++++++++++++++~+
Fluchen ist die einzige Sprache, die jeder Programmierer perfekt beherrscht


Linux is for free...if your time is worth nothing
++++++++++++++++++++~+

742 Beiträge seit 2005
vor 8 Jahren

@sth_Weird: Verstehe nicht.

P
441 Beiträge seit 2014
vor 8 Jahren

Templates können explizit für einen Datentypen erstellt werden.
Unterscheidet man durch Zuweisung über den Datentypen entfällt der Templateselektor.


<DataTemplate Type="{x:Type namespace:ClassA}">....</DataTemplate>
<DataTemplate Type="{x:Type namespace:ClassB}">...</DataTemplate>

Implementieren A und B das gleiche Interface, so wird je nach ankommendem Objekt "von" dem Interface das entsprechende DataTemplate genutzt.