Wie kann ich dies tun würde:
ich durch den Bau einer einfachen Ansicht-Modellklasse beginnen würde, die eine XmlElement
um wickelt und setzt sie als Konfigurationsoption. Diese Klasse könnte extrem einfach sein, zum Beispiel:
public class OptionView
{
private XmlElement XmlElement;
public OptionView(XmlElement xmlElement)
{
XmlElement = xmlElement;
}
public string Name { get { return XmlElement.Name; } }
public string Value
{
get { return XmlElement.InnerText; }
set { XmlElement.InnerText = value; }
}
}
Jetzt kann ich eine Sammlung von ElementView
Objekte aus einem XmlDocument
füllen, fügen Sie diese Sammlung an das Fenster des ResourceDictionary
und formatieren Sie die Objekte mit einer einfachen DataTemplate
, zB:
<DataTemplate x:Key="OptionViewTemplate" DataType={x:Type local:OptionView}>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition SharedSizeGroup="Name"/>
<ColumnDefinition SharedSizeGroup="Value"/>
</Grid.ColumnDefinitions>
<Label Content="{Binding Name}" Grid.Column="0"/>
<TextBox Text="{Binding Value}" Grid.Column="1"/>
</Grid>
</DataTemplate>
...
<ItemsControl Grid.IsSharedSizeScope="True"
ItemsSource="{DynamicResource OptionCollection}"/>
(Anmerkung:. Später können Sie Lust bekommen, und Subklassen von OptionView
zum Beispiel basierend auf definieren, der Datentyp der zugrunde liegenden XmlElement
Dann können Sie definieren DataTemplate
s für jede Unterklasse, und solange jeder das Element in einem zweispaltigen Raster unter Verwendung dieser SharedSizeGroup
darstellt, kann die zweite Spalte eine Datumsauswahl oder Optionsfelder oder alles, was für die Unterklasse geeignet ist, enthalten zur Laufzeit ordentlich angelegt.)
Sobald ich das funktionierte, was nicht lange dauern würde, würde ich beginnen, die OptionView
Klasse zu erweitern. Wenn Ihr Schema beispielsweise ein für Menschen lesbares Label für ein Element in einem xs:annotation
-Element speichert (und wenn nicht, warum nicht?), Würde ich den Name
-Eigenschaftsextrakt aus der -Eigenschaft SchemaInfo
machen , anstatt den zugrunde liegenden Elementnamen anzuzeigen.
Offensichtlich würde ich Validierung hinzufügen möchten, also würde ich eine Validierungsmethode hinzufügen, die XmlElement
's SchemaInfo
Eigenschaft untersucht und interpretiert. (Wenn Sie davon ausgehen, dass es sich bei den zu überprüfenden Elementen um einfache Inhalte handelt, sollte dies nicht schwierig sein.) Es gibt eine Million Tutorials zur Implementierung der Validierung in WPF-Anwendungen. Daher werde ich hier nicht zu sehr ins Detail gehen.
Wenn es viele Konfigurationsoptionen gibt und Sie sie intelligent in Kategorien einteilen können, würde ich eine höhere Klasse erstellen, die (mindestens) zwei Eigenschaften - eine Zeichenfolge CategoryName
Eigenschaft und eine OptionsViews
Sammlung - ausfüllt es aus dem XML-Dokument, und fügen Sie es in das Fenster ResourceDictionary
. Innerhalb des Fensters ich es an einen TabControl
binden würde, z.B .:
<TabControl ItemsSource="{DynamicResource OptionCategories}">
<TabControl.ItemContainerStyle>
<Style TargetType="{x:Type CategoryView}">
<Setter Property="Header" Value="{Binding Path=CategoryName}"/>
<Setter Property="Content" Value="{Binding Path=OptionsViews}"/>
<Setter Property="ContentTemplate" Value="{StaticResource OptionViewTemplate}"/>
</Style>
</TabControl.ItemContainerStyle>
</TabControl>
oder bis zu einem gewissen Punkt Steuerelement, dessen Element Container-Vorlage erstellt eine Expander
. Oder so. (Alle Codes garantiert ungeprüft!Das meiste davon wurde jedoch aus den Arbeitsprojekten heraus kopiert.)
Wenn Sie noch nichts mit WPF gemacht haben, ist dies ein ziemlich gutes Projekt. Es wird Ihnen die Grundlagen der Datenbindung und der Elementkontrollen und -validierung zugänglich machen, und das Endergebnis wird etwas sein, das nützlich ist und wahrscheinlich ziemlich gut aussieht.
Und Sie werden feststellen, dass, während das Markup beim Erstellen der Vorlagen ziemlich ausführlich ist, gibt es nur zwei Vorlagen. Der einzige Code in der Anwendung (bisher) ist der Code, der die XmlElement
s der Benutzeroberfläche zur Verfügung stellt.
Einige nützliche brainfood es Robert, danke. –