无法识别隐式映射到System.Xml.XmlDocument的DataTemplate

时间:2011-12-02 03:40:32

标签: wpf datatemplate

我正在尝试创建自己的控件来查看XmlDocuments。

我对WPF的理解是我可以创建一个隐式映射到某种类型的DataTemplate。

然后,如果我将这种类型的对象分配给ContentPresenter,它将自动选择适当的DataTemplate。

那么为什么这个15行的XAML不工作呢?

<Window x:Class="TestDataTemplates.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:systemXml="clr-namespace:System.Xml;assembly=System.Xml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <DataTemplate DataType="{x:Type systemXml:XmlDocument}"> 
            <TextBlock Text="Look! An xml document!" />
        </DataTemplate>
        <systemXml:XmlDocument x:Key="TokenXmlDocument" />
    </Window.Resources>
    <Grid>
        <ContentPresenter Content="{StaticResource ResourceKey=TokenXmlDocument}"  />
    </Grid>
</Window>

ContentPresenter的内容是一个XmlDocument,所以它应该利用我为它创建的数据模板。我应该看到文字“Look!An xml document!”。

相反,我看到一个空窗口。

<小时/> 稍后修改:有人在此遇到类似问题:Why are XML DataTemplates ignored?

3 个答案:

答案 0 :(得分:1)

奇怪!真。

这很有效!

<Window x:Class="WpfApplication1.Window2"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfApplication1"
    xmlns:sysxml="clr-namespace:System.Xml;assembly=System.Xml"
    Title="Window2" Height="350" Width="525">
  <Window.Resources>
     <DataTemplate DataType="{x:Type sysxml:XmlDocument}">
        <TextBlock Text="Look! A system Xml!" />
     </DataTemplate>
     <local:LocalXmlDocument x:Key="LocalXmlDocument" />
  </Window.Resources>
  <StackPanel x:Name="Panel">
     <ContentPresenter Content="{StaticResource LocalXmlDocument}"  />
  </StackPanel>
</Window>

并且代码背后......

public class LocalXmlDocument : XmlDocument
{
}

WPF奇怪的无法解释的世界!

答案 1 :(得分:0)

F1:

  

如果模板用于对象数据,则此属性包含   数据对象的类型名称(作为字符串)。要参考类型   类的名称,使用x:Type标记扩展。如果模板是   对于XML数据,此属性包含XML元素名称。   有关指定a的详细信息,请参阅文档备注   XML元素的非默认命名空间。

答案 2 :(得分:0)

相反“{x:输入sysxml:XmlDocument}”使用“#document”