WPF MVVM Erstellen von dynamischen Steuerelementen - Ich habe ein Raster, in dem ich die Details eines Jobs (Sie können etwas wie einen SQL-Server-Job sagen) finden.
Nun könnte es für jeden Job eine Anzahl von Jobvariablen geben. Wenn ich den Datensatz für einen Job abrufe, erhält er diese Auflistung von Job-Variablen, bei denen es sich um ein Name-Wert-Paar handelt, wobei Wert eine Sammlung oder ein Datetime-Wert oder sogar ein Int oder eine Zeichenfolge sein kann.
Nun, was ich hier erreichen möchte, ist: - Wenn die Laufvariable ein Datetime ist, brauche ich einen Datepicker - Wenn es ein int / String ist, brauche ich ein Textfeld - Wenn es sich um eine Sammlung handelt, dann ein Kombinationsfeld. - Es ist ein bisschen Feld, dann ein Kontrollkästchen
Ich bin mir nicht sicher, wie ich das erreichen kann, da diese Werte für jeden einzelnen Job unterschiedlich sein können.
Ich gehe davon aus, dass Sie einige Objekte, die diese Name / Wert-Paare repräsentieren, in ein ItemsControl
setzen, indem Sie die Eigenschaft ItemsSource
festlegen.
Es gibt ein paar Lösungen, die Sie verwenden können.
DataTemplate
mit Triggern: Bei diesem Ansatz wird der "Typ" jedes Ihrer Objekte durch die Eigenschaft YourPropertyType
als String dargestellt. Sie setzen ItemTemplate
Ihrer ItemsControl
auf eine Vorlage, die ein ContentControl
hostet. Für die ContentControl
selbst wird ContentTemplate
dynamisch mit Triggern ausgewählt.
All dies kann deklarativ in XAML getan werden.
Ich nehme an, Sie haben weitere DataTemplates
named DefaultTemplate
(dies kann leer sein), IntegerTemplate
, StringTemplate
usw., um die visuelle Struktur für jeden Fall zu skizzieren.
Dies wäre dann ItemsControl.ItemTemplate
:
DataTemplateSelector
: Dieser Ansatz erfordert Code-Behind, aber es zwingt Sie nicht, den "Typ" jedes Name / Wert-Paares als Zeichenfolge anzugeben, und Sie können auswählen, welche Vorlage mit viel komplexerer Logik verwendet werden soll.
>Es beinhaltet das Erstellen einer Klasse als Vorlagenauswahl:
%Vor% Dann müssen Sie einen Template-Selektor irgendwo instanziieren (sagen wir in Ihrem UserControl
)
Beachten Sie, dass ich eine DefaultTemplate
-Eigenschaft von YourObjectDataTemplateSelector
verfügbar gemacht und diese über XAML auf eine Vorlage gesetzt habe. In der Praxis würden Sie mehr Eigenschaften vom Typ DataTemplate
für YourObjectDataTemplateSelector
definieren und den Vorlagenselektor beim Hinzufügen in das Ressourcenwörterbuch Ihres Steuerelements "konfigurieren". Auf diese Weise können Sie die Vorlagen für jeden Fall mit der Erweiterung StaticResource
markup von XAML direkt festlegen.
Verknüpfen Sie schließlich den Vorlagen-Selektor mit Ihrem ItemsControl
:
Ich glaube, Sie suchen nach einer Form von Data Templating und der DataTemplateSelector um zu erreichen, wonach Sie suchen.