Как бы я это сделал:
Я бы начал с создания простого класса модели представления, который охватывает XmlElement
и выставляет его в качестве параметра конфигурации. Этот класс может быть чрезвычайно простым, например ::
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; }
}
}
Теперь я могу заполнить коллекцию ElementView
объектов из XmlDocument
, добавить эту коллекцию в ResourceDictionary
окна и отформатировать объекты с помощью простого DataTemplate
, например ::
<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}"/>
(Примечание. Позже вы можете получить фантазию и определить подклассы OptionView
на основе, например, типа данных базового XmlElement
. Затем вы можете определить DataTemplate
s для каждого подкласса и как Пока каждый представляет элемент в сетке из двух столбцов, используя этот SharedSizeGroup
, второй столбец может содержать указатель даты или переключатели, или что-либо подходящее для подкласса, и все это будет аккуратно размечено во время выполнения .)
Как только я получу эту работу, которая не займет много времени, я начну расширять класс OptionView
. Например, если ваша схема хранит удобочитаемую метку для элемента в элементе xs:annotation
(а если нет, то почему бы и нет?), Я бы заставил свойство Name
извлечь это из XmlElement
свойство SchemaInfo
, вместо предоставления имени базового элемента.
Очевидно, я бы хотел добавить проверку, поэтому я бы добавил метод проверки, который проверял бы свойство XmlElement
SchemaInfo
и интерпретировал его. (Предполагая, что элементы, которые вы проверяете, являются простым содержимым, это не должно быть сложно.) Существует миллион учебных пособий о том, как реализовать проверку в приложениях WPF, поэтому я не буду вдаваться в подробности.
Если есть тонны опций конфигурации, и у вас есть какой-то разумный способ сгруппировать их по категориям, я бы построил класс более высокого уровня, который предоставил бы (как минимум) два свойства - свойство CategoryName
строки и OptionsViews
collection - заполните его из XML-документа и добавьте в окно ResourceDictionary
. В окне я бы привязал его к TabControl
, например ::1010 *
<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>
Или некоторому элементу управления, чей шаблон контейнера элементов создает Expander
. Или что-то. (Весь код гарантирован непроверенным! Однако большая часть его была скопирована из рабочих проектов.)
Если вы ничего не делали с WPF раньше, это довольно хороший проект для начала. Это познакомит вас с основами привязки данных, контроля и проверки элементов, а конечный результат будет чем-то полезным и, вероятно, выглядит довольно хорошо.
И вы заметите, что хотя разметка, используемая при создании шаблонов, довольно многословна, существует только два шаблона. Единственный код в приложении (пока) - это код, который предоставляет XmlElement
s для пользовательского интерфейса.