为什么我的输入数据模板没有被应用?

14

我正在使用 Linq To Sql 填充列表框,其中包括 Segment 对象,Segment 是由设计器创建/ORM 生成的类。

<Window x:Class="ICTemplates.Window1"
    ...
    xmlns:local="clr-namespace:ICTemplates"
    Title="Window1" Height="300" Width="300">
    <Window.Resources>
      <DataTemplate x:Key="MyTemplate"> 
      <!--  <DataTemplate DataType="x:Type local:Segment"> -->
        // some stuff in here
      </DataTemplate>
    </Window.Resources>
    <ListView x:Name="tvwSegments" ItemsSource="{Binding}" ItemTemplate="{StaticResource MyTemplate}" MaxHeight="200"/>


// code-behind
var queryResults = from segment in tblSegments
                               where segment.id <= iTemplateSid
                               select segment;
tvwSegments.DataContext = queryResults;

这个方法是有效的。

但是,如果我使用了一个Typed Data Template(通过将x:Key替换为模板上的DataType属性),所有项目都会显示为ICTemplates.Segment(ToString()返回值)。 概念是如果类型匹配,则应自动选择数据模板。有人能发现这里的错误吗?

2个回答

35

这里有一个错误

<DataTemplate DataType="x:Type local:Segment">  <!-- doesn't work -->

应该是

<DataTemplate DataType="{x:Type local:Segment}">

回家后...制作了一个玩具样品,通过这个更改它能够工作。明天在工作中得尝试一下。唉...就因为缺少两个花括号...

更新: 发现了另一个陷阱

<DataTemplate x:Key="SegTemplate" DataType="{x:Type local:Segment}">  <!-- doesn't work -->

无法正常工作。似乎您只能使用关键字 数据类型属性中的一个。为了使这个类型化的数据模板工作...必须删除关键字属性,现在它按预期工作。对于分层数据模板,行为也是一致的。

<DataTemplate DataType="{x:Type local:Segment}">

根据文档,x:Key 覆盖了隐式(自动生成的)类型相关键。模板仍然可以工作,但您必须在对象中显式声明它。 - heltonbiker
1
我遇到了关于密钥的问题。谢谢 :) - Frederik
你真丢脸,微软。 - ljk321

0
这只是一种猜测,但是可能是因为上下文设置为IQueryable吗?如果将DataContext设置为Segment的单个实例,是否会得到相同的结果?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接