Comment je ferais ceci:
Je commence par la construction d'une classe simple vue-modèle qui enroule autour d'un XmlElement
et il expose comme une option de configuration. Cette classe pourrait être extrêmement simple, par exemple:
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; }
}
}
Maintenant, je peux remplir une collection de ElementView
objets à partir d'un XmlDocument
, ajouter cette collection à ResourceDictionary
de la fenêtre, et mettre en forme les objets avec un DataTemplate
simple, par exemple:
<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}"/>
(note:. Plus tard, vous pouvez obtenir la fantaisie, et de définir des sous-classes de OptionView
en fonction, par exemple, le type de données sous-jacentes de la XmlElement
Ensuite, vous pouvez définir DataTemplate
s pour chaque sous-classe, et aussi longtemps que chacun présente l'élément dans une grille à deux colonnes en utilisant ce SharedSizeGroup
, la deuxième colonne peut contenir un sélecteur de date, ou des boutons radio, ou tout ce qui est approprié à la sous-classe, et tout Une fois que je me suis mis au travail, ce qui ne serait pas long, je commencerais à étendre la classe OptionView
. Par exemple, si votre schéma stocke une étiquette lisible par un humain pour un élément dans un élément (et si ce n'est pas le cas, pourquoi?), Je ferais en sorte que la propriété Name
extrait la propriété SchemaInfo
de XmlElement
, au lieu d'exposer le nom de l'élément sous-jacent.
Évidemment je voudrais ajouter la validation, ainsi j'ajouterais une méthode de validation qui a examiné la propriété SchemaInfo
de XmlElement
et l'ai interprétée. (En supposant que les éléments que vous validez soient simples, cela ne devrait pas être difficile.) Il y a un million de tutoriels sur la façon d'implémenter la validation dans les applications WPF, donc je n'entrerai pas dans les détails ici.
S'il y a des tonnes d'options de configuration et vous avez une certaine façon intelligente de les grouper en catégories, je construirais une classe de niveau supérieur qui a exposé (au moins) deux propriétés - une chaîne CategoryName
propriété et une collection OptionsViews
- remplir à partir du document XML, et l'ajouter à ResourceDictionary
de la fenêtre. Dans la fenêtre, je le lier à un TabControl
, .: par exemple
<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>
ou à un contrôle de l'élément dont le modèle contenant un objet crée un Expander
. Ou quelque chose. (Tout le code garanti non testé!La plus grande partie a été copiée des projets de travail, cependant.)
Si vous n'avez encore rien fait avec WPF, c'est un très bon projet pour commencer. Cela vous exposera aux principes fondamentaux de la liaison de données et des contrôles et validations des éléments, et le résultat final sera quelque chose d'utile et probablement très bien.
Et vous remarquerez que bien que le balisage impliqué dans la création des modèles soit assez verbeux, il n'y a que deux modèles. Le seul code dans l'application (jusqu'à présent) est le code qui expose les XmlElement
s à l'interface utilisateur.
Certains y brainfood utiles Robert, merci. –