Вот сценарий. Мы используем большой конфигурационный XML-файл для одного из наших серверных продуктов. Этот файл довольно хорошо размечается и проверен против файла XSD.
Время теперь, хотя создать GUI конфигурации для поддержания этого файла, и я хотел бы погрузиться в WPF, чтобы сделать это. Я мог разметить отдельную форму для каждого раздела конфигурации, осуществив рефакторинг, и перераспределяя каждый раз мы добавляем опцию к файлу конфигурации, но я надеюсь, что существует более умный способ сделать это.
Так как у меня уже есть xml/xsd комбинация со строгим контролем типов, я надеюсь, что существует изящный метод для создания UI для редактирования этого достаточно легко. Я знаю, что мог записать xml-> xaml преобразование, но надеялся, что существует что-то там уже, чтобы сделать тяжелый подъем для меня?
Заранее спасибо..
Как бы я сделал это:
Я бы начал с создания простого класса модели представления, который оборачивается вокруг 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 Свойство
извлекает это из свойства SchemaInfo
XmlElement
, вместо того, чтобы отображать имя базового элемента.
Очевидно, я хотел бы добавить проверку, поэтому я ' d добавить метод проверки, проверяющий свойство SchemaInfo
XmlElement
и интерпретирующий его. (Предполагая, что проверяемые вами элементы представляют собой простой контент, это не должно быть сложно.) Существует миллион руководств о том, как реализовать проверку в приложениях WPF, поэтому я не буду вдаваться в подробности здесь.
Если существует множество параметров конфигурации, и у вас есть какой-то разумный способ сгруппировать их по категориям, я бы создал класс более высокого уровня, который предоставляет (как минимум) два свойства - строку CategoryName
свойство и Коллекция OptionsViews
- заполните ее из документа XML и добавьте в ResourceDictionary
окна. В окне я бы привязал его к TabControl
, например:
<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
пользовательскому интерфейсу.
Если вы раньше ничего не делали с WPF, это неплохой проект для начала. Он познакомит вас с основами привязки данных и элементов управления и проверки, а конечный результат будет чем-то полезным и, вероятно, выглядит довольно хорошо.
И вы заметите, что хотя разметка, используемая при создании шаблонов, довольно многословна, шаблонов всего два. Единственный код в приложении (пока) - это код, который предоставляет XmlElement
пользовательскому интерфейсу.
Если вы раньше ничего не делали с WPF, это неплохой проект для начала. Он познакомит вас с основами привязки данных и элементов управления и проверки, а конечный результат будет чем-то полезным и, вероятно, выглядит довольно хорошо.
И вы заметите, что хотя разметка, используемая при создании шаблонов, довольно многословна, шаблонов всего два. Единственный код в приложении (пока) - это код, который предоставляет XmlElement
пользовательскому интерфейсу.
И вы заметите, что хотя разметка, используемая при создании шаблонов, довольно многословна, шаблонов всего два. Единственный код в приложении (пока) - это код, который предоставляет XmlElement
пользовательскому интерфейсу.
И вы заметите, что хотя разметка, используемая при создании шаблонов, довольно многословна, шаблонов всего два. Единственный код в приложении (пока) - это код, который предоставляет XmlElement
пользовательскому интерфейсу.