窗口资源中未找到ItemTemplate

4

我有一个窗口,它显示了2个列表,这两个列表应该使用相同的模板。因此,我考虑将模板放到我的窗口中的资源中,像这样:

<Grid>
    <Grid.Resources>
        <DataTemplate DataType="itemTemplateAsResourceTest:FeatureViewModel" x:Key="FeatureTemplate">
            <TextBlock Margin="5" Text="{Binding Name}"/>
        </DataTemplate>
    </Grid.Resources>

    <ListBox ItemTemplate="{StaticResource FeatureTemplate}" ItemsSource="{Binding Features}"/>
</Grid>

Features 只是 FeatureViewModel 的一个列表(我将其放在我的主窗口中进行测试)。而在我的测试中,FeatureViewModel 简单地如下所示:

public class FeatureViewModel
{
    public string Name
    {
        get { return "Name"; }
    }
}

在设计器中它能正常工作,但当我启动我的应用程序时,它会显示“找不到资源'FeatureTemplate'”。这不可能是拼写错误,因为设计器能找到它!我做错了什么?

当我直接将模板放入ListBox中时,它可以工作,但这样我就必须复制我的模板:

<Grid>
    <ListBox ItemsSource="{Binding Features}">
        <ListBox.ItemTemplate>
            <DataTemplate DataType="itemTemplateAsResourceTest:FeatureViewModel">
                <TextBlock Margin="5" Text="{Binding Name}"/>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Grid>

重命名模板或直接将其移动到Windows资源中并没有解决问题,有人看到我的错误吗? 解决方案 更改:
<DataTemplate DataType="itemTemplateAsResourceTest:FeatureViewModel" x:Key="FeatureTemplate">

to

<DataTemplate DataType="{x:Type itemTemplateAsResourceTest:FeatureViewModel}" x:Key="FeatureTemplate">

做到了!
1个回答

2
删除DataType。它是多余的,因为您已经设置了x:Key。除此之外,还有一个错误,因为(与例如Style.TargetType相反),您必须使用{x:Type ...}标记扩展。否则,DataType属性(类型为object)只会将 XAML 中应用的字符串设置为对象,而不是您想要设置的Type

Resharper真是太让人失望了,居然不能自动正确地完成这个操作!我又测试了一遍:它可以自动建议正确的类型并添加命名空间,但却忘记了加上x:Type!!由于我喜欢指定数据类型以便获得自动完成和警告,所以我更喜欢添加{x:Type...}而不是留空。 - JCH2k

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