Laden...

WPF - UI Dynamisch ändern

Erstellt von Rioma vor 9 Jahren Letzter Beitrag vor 9 Jahren 1.884 Views
R
Rioma Themenstarter:in
228 Beiträge seit 2013
vor 9 Jahren
WPF - UI Dynamisch ändern

Hallo zusammen,

ich bräuchte mal einen Denkanstoß.

Ich habe eine Datei in der Hierarchische Datensätze vorliegen (maximal 3 Hierarchien). Die Datei ist nicht änderbar und besitzt über 100 Spalten und je nach Datensatz steht in den Spalten etwas unterschiedliches. Diese sollen in einer Treeview landen und bearbeitet werden können. Die Hierachie kann ich anhand einer Kennung ablesen. 110 gehört zu 100, 120 gehört zu 100, 250 gehört zu 200 usw. Hinter der Kennung folgen die Werte.
Die Datensätze sollen nun unter anderem bearbeitet werden können und da für jeden Datensatz andere Werte bearbeitet werden sollen, kann ich nicht einfach eine "statische" UI mit Binding anlegen.

Es muss also je nach selectedItem die UI angepasst werden.

Meine Idee war jetzt per UserContol\ViewModel\Datatemplate und ContentControl je nach ausgewähltem TreeviewItem die UI dynamisch anzupassen.

Mein Problem hierbei ist, dass die Daten zusammen hängen und ich so für jedes UserControl ein eigenes ViewModel hätte.

Genauer:


100
     120
     130
     140
200
     210
     230
     260
300
     310

Wähle ich nun 130 aus, muss ich die UI anpassen, wähle ich 120 muss ich die UI anpassen usw. Insgesamt würde es sich um ungefär 7 Usercontrols handeln.

Wenn ich nun eine Object-Struktur habe, die diese Hierarchie abbildet, wie implementiere ich die dynamische UI in Verbindung mit den ständig wechselnden ViewModels.

Ich nehmen an, dass es eine einfache Lösung gibt und mir Wissen zu WPF/MVVM fehlt.

Ich hoffe ihr habt mich verstanden und könnt mir einen Tipp geben

P
157 Beiträge seit 2014
vor 9 Jahren

Hallo,

hast du unterschiedliche typen ? Dann ist das sehr leicht, wenn nicht wäre es angebracht für die Daten die du bearbeiten möchtest, entsprechend unterschiedliche viewmodeltypen anzulegen...

Über die DataTemplates legst du dann den DataType fest und setzt dann dein selecteditem als datacontext in dein contentcontrol...das sollte eigentlich reichen.

Wenn du mit DataRow ankommst...oder ein Objekt das alles hat - ist genauso kakka, kannst du nen DataTemplateSelektor verwenden, da gibst du dann über prüfungen das entsprechende datatemplate zurück.

vg

Wenn's zum weinen nicht reicht, lach drüber!

R
Rioma Themenstarter:in
228 Beiträge seit 2013
vor 9 Jahren

Danke für deinen Tipp. So hatte ich es umgesetzt und es funktioniert nun auch Problemlos.

Eine Frage hätte ich noch.

Das Problem ist, dass die Objekte aus einer CSV Datei kommen, mit sehr vielen Spalten > 150. Diese Spaltenanzahl ist in jeder Zeile gleich, allerdings sollen immer unterschiedliche Spalten bearbeitet werden können und die Spalten "heißen" pro Datensatz auch anders.

Die Idee war jetzt, verschiedene Usercontrols zu verwenden für die entsprechend unterschiedlichen Bindings (möglicherweise auch die Anzahl der zu bearbeitenden Spalten).

Wie oben beschrieben, funktioniert auch das Problemlos, allerdings recht unflexibel.

Eine Idee war jetzt noch eine Klasse zu haben mit der Anzahl der Spalten als Properties.
Da die bei jedem Datensatz gleich sind, würde dieses Model als Vorlage für alle Datensätze dienen. Nicht ganz so schön für OOP, allerdings sehe ich das Problem noch eine Ebene tiefer bei der CSV-Datei die leider nicht änderbar ist.

Die Properties heißen von mir aus column0 bis column150.

Per reflection und for Schleife kann ich in ein paar Zeilen Code die gesamte csv in den Speicher holen und die Hierarchie abbilden.

Ich bräuchte so auch nur ein ViewModel in das dann mein Model mit den jeweiligen Werten geschmissen wird.

Das einzige was angelegt werden müsste, wäre das Usercontrol und das Binding auf die entsprechende columns.

Auch das zurückschreiben wäre so in ein paar Zeilen Code erledigt.

Mein Problem ist, dass ich das ViewModel per Datatemplate nicht an mehrere UserControls "binden" kann


<Window.Resources>
        <DataTemplate DataType="{x:Type viewModel:RecordViewModel}">
            <ucont:Control1/> <-- Beispiel Namen -->
        </DataTemplate>
        <DataTemplate DataType="{x:Type viewModel:RecordViewModel}">
            <ucont:Control2/>
        </DataTemplate>
        <DataTemplate DataType="{x:Type viewModel:RecordViewModel}">
            <ucont:Control3/>
        </DataTemplate>
        <DataTemplate DataType="{x:Type viewModel:RecordViewModel}">
            <ucont:Control4/>
        </DataTemplate>
    </Window.Resources>

Gibt es hierfür eine Lösung? (Ich kann natürlich eine Basisklasse nehmen, und leere ViewModel anlegen...)

5.658 Beiträge seit 2006
vor 9 Jahren

Hi Rioma,

da du hierarchische Daten hast, benötigst du auch ein hierarchisches ViewModel. Wie du die einzelnen Datensätze aus der CSV-Datei in die richtige Hierarchie bringst, ist Sache des ViewModels. Für die Datenbindung benötigst du ein HierarchicalDataTemplate, das du an den TreeView binden kannst.

Christian

Weeks of programming can save you hours of planning