我有XML文档
<fields>
<field type="text">Firstname</field>
<field type="text">Lastname</field>
<field type="date">Birthday</field>
</fields>
(这是一个简单的例子,但内部字段有关于某些边距,文本大小或TextBox等的声明)
我必须根据XML文档内容为文本生成TextBox等控件,为日期生成一些DatePicker(扩展wpf)。 我无法在代码隐藏中生成它,此时,在检查了许多类似于我的问题的不同事物的例子后,我很困惑。
我写的项目是使用MVVM模式,IoC(来自Prism的UnityBootstrapper)和来自Prism框架的区域编写的。我一直在考虑使用UserControls(视图)和像TextBoxModule这样的棱镜模块来包装TextBox / DatePicker等,并动态注入它们,但我认为这不是一个好主意。
我正在寻找一些方向:/
答案 0 :(得分:-1)
好的,所以最终的结果是一个带有控件的网格,而不是标记的字段列表。
我认为来自PRISM的区域和其他东西只会妨碍这一点,我不会使用它们中的任何一种。
现在构建动态UI的推荐方法是使用XamlReader。 Load方法允许您从文件创建UI对象,从字符串创建Parse方法。 如果你要反复做同样的ui那么写一个文件和xamlreader.load将是你要走的路。如果他们一次性解决,那么解析会更方便。 https://msdn.microsoft.com/en-us/library/system.windows.markup.xamlreader.parse%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396 这给你一个对象 - 我认为你的网格最好。
由于XAML是xml,因此您可以使用xml linq机制来读取xml,然后再将与控件对应的xml节点写入字符串。 您可以在这里查看样品: https://social.technet.microsoft.com/wiki/contents/articles/28797.wpf-dynamic-xaml.aspx 从那里开始编写代码有点毫无意义,无论如何都有一点点。 没有人完全准确地完成你想要的东西,但如果你不知道怎么做,那里的东西很难解决。 例如,你需要使用parsercontext等效于xmlns。网格将完全独立于现有的XAML进行实例化,因此您需要告诉它使用与窗口或用户控件相同的库。
我不确定所显示的xml的代表性如何,所以我不会尝试写一些东西来处理那些我会给你一些东西来展示如何迭代节点并让你开始。
string myXMLfile = @"d:\biz\xml.xml";
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(myXMLfile);
XmlElement xmlRoot = xmlDoc.DocumentElement;
XmlNodeList Fields xmlRoot.ChildNodes;
foreach (XmlNode field in Fields)
{
您可以使用.Name和.InnerText。 属性(显然)也有xmlattributes。