Создание редактора WPF для XML-файла на основе схемы

Вот сценарий. Мы используем большой конфигурационный XML-файл для одного из наших серверных продуктов. Этот файл довольно хорошо размечается и проверен против файла XSD.

Время теперь, хотя создать GUI конфигурации для поддержания этого файла, и я хотел бы погрузиться в WPF, чтобы сделать это. Я мог разметить отдельную форму для каждого раздела конфигурации, осуществив рефакторинг, и перераспределяя каждый раз мы добавляем опцию к файлу конфигурации, но я надеюсь, что существует более умный способ сделать это.

Так как у меня уже есть xml/xsd комбинация со строгим контролем типов, я надеюсь, что существует изящный метод для создания UI для редактирования этого достаточно легко. Я знаю, что мог записать xml-> xaml преобразование, но надеялся, что существует что-то там уже, чтобы сделать тяжелый подъем для меня?

Заранее спасибо..

10
задан Fergal Moran 17 December 2009 в 15:53
поделиться

1 ответ

Как бы я сделал это:

Я бы начал с создания простого класса модели представления, который оборачивается вокруг 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 пользовательскому интерфейсу.

12
ответ дан 3 December 2019 в 21:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: