Chr*_*ham 8 c# wpf xaml .net-4.0
我想在运行时使用加载DataTemplate XamlReader,但它抛出异常"前缀'x'不映射到命名空间."
这是我传递给的XML字符串XamlReader:
<xm:ResourceDictionary
xmlns:xm="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:do="clr-namespace:MyLibrary.DataObjects;assembly=MyLibrary.DataObjects"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<xm:DataTemplate DataType="{x:Type do:ValidationResponse}">
<xm:StackPanel Orientation="Horizontal">
<xm:Label>MessageID</xm:Label>
<xm:TextBox Text="{Binding Path=MessageID}"/>
</xm:StackPanel>
</xm:DataTemplate>
</xm:ResourceDictionary>
Run Code Online (Sandbox Code Playgroud)
这是读它的代码:
ResourceDictionary dictionary = XamlReader.Parse(myXamlString) as ResourceDictionary;
Run Code Online (Sandbox Code Playgroud)
这是有趣的部分,如果我添加x:Key="ValidationResponseTemplate"到DataTemplate它解析没有任何异常.但是,我无法保持这种方式,因为我无法通过程序自己的键来指定DataTemplate .xaml(在运行时获取模板之前它不会知道模板).
该x命名空间中都属于程序自身的定义.xaml和XML的片段,我试图解析.
总体目标:能够提供新的DataTemplates,既可以在运行时更改显示的外观,也可以显示客户端在编译时不知道的XML数据.
找到了解决方法:如果XamlReader我给它一个XmlReader. 其中定义的 XML 片段DataTemplate是一个更大的 XML 文档的一部分,该文档的所有命名空间都在其根中定义。这已经被读入一个XDocument,并且我从其中抓取了其中定义的XElement。ResourceDictionary新代码是 的一部分MainWindow.xaml.cs,如下所示:
ResourceDictionary dictionary = XamlReader.Load(myXElement.CreateReader()) as ResourceDictionary;
this.Resources.MergedDictionaries.Add(dictionary);
Run Code Online (Sandbox Code Playgroud)
这引发了一个不同的异常,它无法解析(http://myschemas/MyProfile)Binding. 事实证明,您需要限定所有内容的名称空间,包括{Binding ...}引用。因此 XML 片段必须修改为:
<xm:TextBox Text="{xm:Binding Path=MessageID}"/>
Run Code Online (Sandbox Code Playgroud)
现在 XamlParser 知道这Binding是“http://schemas.microsoft.com...”命名空间中的类型。
| 归档时间: |
|
| 查看次数: |
3378 次 |
| 最近记录: |