Laden...

(User)Control mit Edit modus

Erstellt von Caveman vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.160 Views
Caveman Themenstarter:in
187 Beiträge seit 2009
vor 5 Jahren
(User)Control mit Edit modus

Hallo,
ich möchte mich aktuell mit Controls und UserControls beschäftigen. Einfache Beispiele aus einem Lehrbuch habe ich dazu schon durchgearbeitet. Leider fehlt es aber immer noch am Aha-Effekt für ein komplizierteres Beispiel. Mit googlen oder youtube Videos bin ich bis jetzt nicht recht viel weiter gekommen.
Ich hab mir einfach so Mal zur Aufgabe gestellt, ein (User)Control zu entwickeln, das über einen Edit-Modus verfügt. Da ich keinen konkreten Anwendungsfall dafür habe, versuche ich das jetzt am Beispiel von XML zu erklären.
Angenommen, ich hätte eine XML Datei zu visualisieren, dann könnte ich die einzelnen Knoten mit einem (User)Control darstellen.
In der Standardansicht soll nur der Text angezeigt werden - wie bei einem Texteditor. Beispiel:

<node param1="value1" param2="value2" param3="value3" />

Durch einen Klick auf einen Button oder Doppelklick auf das (User)Control soll es in einen Editmodus versetzt werden, indem man die "values" editieren kann. Dazu sollen Comboboxen, Listboxen, TextBoxen, usw. dargestellt werden. Beispielsweise "value1" in einer ComboBox, value2 in einer TextBox.
Im Moment stehe ich vor der Frage, ob ich dafür ein CustomControl brauche, oder ob das auch mit einem UserControl funktionieren würde. Tendiere aber dazu, dass es wohl ein CustomControl sein muss.
Eine weitere Frage ist, ob das mit nur einem Control funktioniert, oder ob zwei Controls benötigt werden (eines zum Anzeigen und eines zum Editieren). Wahrscheinlich geht es mit nur einem Control.
Wie lässt sich die Umschaltung des Modus bewerkstelligen? Geht das über Template Switching im Custom Control?
An dieser Stelle beisst es leider aus bei mir!
Kann/Will mich hier jemand mit entsprechenden Infos bedienen?
Danke schon Mal im Voraus!

2.079 Beiträge seit 2012
vor 5 Jahren

Technisch ist der Unterschied zwischen einem UserControl und einem CustomControl eher überschaubar, der größte Unterschied ist, dass das UserControl einen Inhalt haben und so die View definieren kann, für das CustomControl brauchst Du ein Template, in dem Du die View definierst. Ein CustomControl kann auch eine Ableitung von einem anderen bekannten Control sein und nur dessen Verhalten ändern.
Die grundlegende, für dich relevante, Verhaltensweise ist bei Beidem gleich.

Prinzipiell brauchst Du eine Property, die definiert, in was für einem Modus das Control sich befindet. Bei einem UserControl ist eine Property im ViewModel einfacher, ein CustomControl sollte mMn. ohne ViewModel auskommen können und stattdessen eine DependencyProperty haben, im Style lässt die sich auch sehr leicht verwenden.

Die Entscheidung, ob nun der TextBlock oder die TextBox angezeigt wird, würde ich in einem UserControl mit ein ContentControl lösen. Das liegt in diesem UserControl und bekommt als Content die relevanten Inhalte, die darin (TextBlock/TextBox) benötigt werden. Als Template (DataTemplate) wird dann definiert, wie es angezeigt wird. Über DataTrigger am Style, die an besagte Property gebunden sind, kannst Du dann unterschiedliche Templates für verschiedene Zustände definieren.

Oder (und das wäre vermutlich der bessere Weg) Du verwendest ein CustomControl und stylest das je nach Zustand. Bei einem XML-Tag würde ich z.B. eine Ableitung der TextBox verwenden, ihr besagte DependencyProperty geben und je nach Zustand dieser Property wird diese TextBox dann anders angezeigt. Soll es nicht änderbar sein, würde ich z.B. den Background transparent machen, den Border entfernen und natürlich ReadOnly.

Spannend wird eher, wie Du die einzelnen Elemente passend zueinander positionierst, aber danach hast Du nicht gefragt 😉 Mir fällt dazu spontan aber die RichTextBox ein, die kann irre viel. Ob sie da das passende Werkzeug ist, kann ich allerdings nicht sagen.

Caveman Themenstarter:in
187 Beiträge seit 2009
vor 5 Jahren

Hallo Palladin007,

danke für die Antworten. Damit komme ich schon mal weiter und habe für die nächsten Tage oder auch Wochen was zu tun, abends im Hotel!
Ähem, was meinst Du mit der Positionierung? Innerhalb des Controls habe ich doch die Möglichkeit, über Container die Elemente anzuordnen. Oder überseh ich da gerade was?

2.079 Beiträge seit 2012
vor 5 Jahren

Ähem, was meinst Du mit der Positionierung? Innerhalb des Controls habe ich doch die Möglichkeit, über Container die Elemente anzuordnen. Oder überseh ich da gerade was?

Du übersiehst nichts, ich meine - auf das Beispiel XML bezogen - die Positionierung der einzelnen XML-Elemente, immerhin soll das am Ende auch wie valides XML aussehen. Das klingt für mich nach ItemsControl in ItemsControl in ItemsControl in ... 😄

Da würde ich bei XML vermutlich ein CustomControl bauen, was wiederum viele Children des selben CustomControls beinhalten kann.
Das nutzt intern ein CustomControl, was die TextBox/TextBlock-Umschaltung ermöglicht, für das Element selber, genauso wie Attribute und Attribut-Werte.