我一直在玩带有内联XML的XmlDataProvider。这是我的代码:
<XmlDataProvider x:Key="InternalData" XPath="/Workspace">
<x:XData>
<Workspace xmlns="" Name="Workspace">
<Project Name="Project 1" />
<Project Name="Project 2" />
<Project Name="Project 3" />
</Workspace>
</x:XData>
</XmlDataProvider>
这与我使用内联XML看到的大多数示例非常相似,但我不断收到错误“XmlDataProvider具有未明确设置其XmlNamespace(xmlns =”“)”的内联XML。我知道这很明显,但为什么我会得到这个错误呢?它应该是有效的,不是吗?似乎没有其他人遇到这个问题,而不是在我搜索谷歌的时候。
提前致谢
更新:为了进一步说明,此错误仅显示在“输出”窗口中。这不是编译器错误,它不会阻止我运行我的程序。我可以读取XML并将其显示在TreeView中。我只想了解为什么我首先得到错误。
答案 0 :(得分:1)
对于它的价值,我在一段时间内就完全相同的错误,在完全相同的MSDN文章上(请参阅http://blog.wouldbetheologian.com/2009/07/why-wpf-databinding-is-awful-technology.html以了解我的内容)。但至于为什么需要它:我完全神秘化了。它似乎不应该是这样,因为使用xmlns =“”并将它留下应该具有相同的效果。我的猜测是,它是微软XAML解析引擎的一些奇怪的工件(当然这不是精确的XML兼容)。也许这个工件是(一个特征),也许不是(一个bug)。
答案 1 :(得分:0)
使用xmlns =“”来默认命名空间是有效的
默认名称空间声明中的属性值可以为空。在声明的范围内,这与没有默认命名空间具有相同的效果。
http://www.w3.org/TR/REC-xml-names/#defaulting
虽然我建议您不妨查看未声明的命名空间前缀x:
命名空间约束:前缀已声明
名称空间前缀,除非它是xml 或者xmlns,必须在a中声明 名称空间声明属性 要么是元素的开始标记 使用前缀的地方或在 祖先元素(即元素中的元素) 其内容为前缀标记 发生)。
答案 2 :(得分:0)
你的例子适合我。如果我通过使用此XAML将其与XmlDataProvider MSDN页面的示例一起使用:
<StackPanel>
<StackPanel.Resources>
<XmlDataProvider x:Key="InternalData" XPath="/Workspace">
<x:XData>
<Workspace xmlns="" Name="Workspace">
<Project Name="Project 1" />
<Project Name="Project 2" />
<Project Name="Project 3" />
</Workspace>
</x:XData>
</XmlDataProvider>
</StackPanel.Resources>
<TextBlock FontSize="18" FontWeight="Bold" Margin="10"
HorizontalAlignment="Center">XML Data Source Sample</TextBlock>
<ListBox
Width="400" Height="300" Background="Honeydew">
<ListBox.ItemsSource>
<Binding Source="{StaticResource InternalData}" XPath="Project" />
</ListBox.ItemsSource>
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock FontSize="12" Foreground="Red">
<TextBlock.Text>
<Binding XPath="@Name"/>
</TextBlock.Text>
</TextBlock>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
我得到了这个结果:
答案 3 :(得分:0)
我有同样的问题...意识到我在XmlDataProvider中使用,因此在标记中设置了namespace属性,如下所示:
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
这与我的Window标签中的xmlns:x相同,所以它似乎是多余的,但也许它是因为xaml解析器将此XmlDataProvider作为单独的XML文档处理,它需要它#s; s这个文件中的命名空间呢?我不知道,但至少错误不会再发生了。