我会怎么做:
我将首先构建一个简单的视图模型类,该类包含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; }
}
}
现在我可以从XmlDocument 填充ElementView 对象的集合,将该集合添加到窗口的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}"/>
(注意:后面你可以花点心思,比如根据底层XmlElement的数据类型来定义OptionView的子类。然后你可以为每个子类定义DataTemplates,如只要每个使用SharedSizeGroup 在双列网格中显示项目,第二列就可以包含日期选择器、单选按钮或任何适合子类的内容,并且它们都会在运行时整齐地布局.)
一旦我完成了这项工作,这不会花很长时间,我就会开始扩展 OptionView 类。例如,如果您的架构正在为 xs:annotation 元素中的元素存储人类可读的标签(如果不是,为什么不呢?),我会让 Name 属性将其从 @ 中提取出来987654335@ 的SchemaInfo 属性,而不是暴露底层元素名称。
显然我想添加验证,所以我想添加一个验证方法来检查XmlElement 的SchemaInfo 属性并对其进行解释。 (假设您要验证的元素是简单的内容,这应该不难。)关于如何在 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 做过任何事情,那么这是一个非常好的开始项目。它将向您展示数据绑定和项目控件和验证的基础知识,最终结果将是有用的,并且可能看起来不错。
您会注意到,虽然创建模板所涉及的标记非常冗长,但只有两个模板。应用程序中的唯一代码(到目前为止)是将XmlElements 暴露给 UI 的代码。