没有任何样式,app.xaml中的datatemplate没有被选中?

21

我在app.xaml中有一个DataTemplate,它将一个视图绑定到一个视图模型。

<Application.Resources>
    <DataTemplate DataType="{x:Type vm:someviewmodeltype}">
        <vw:somevwcontrol />
    </DataTemplate>
</Application.Resources>

如果没有样式,上面的模板就不会被应用。一旦我添加了样式,就像...

<Application.Resources>
    <DataTemplate DataType="{x:Type vm:someviewmodeltype}">
        <vw:somevwcontrol />
    </DataTemplate>
    <Style TargetType="TextBlock">
        <Setter Property="FontSize" Value="20"></Setter>
    </Style>
</Application.Resources>

datatemplate被获取并生成了期望的结果... 我不确定正在发生什么... 有人可以澄清一下吗?

谢谢。

2个回答

28

我在这里回答了类似的问题。虽然那个问题不完全相同,但它很可能是同一个错误。

这是一个优化错误,请参见此链接

在XAML中创建每个对象时, 如果存在默认样式(即具有Type键的样式),则应该应用该样式。 正如您所想象的那样,有几种性能优化可以使该(隐含的)查找尽可能轻量级。 其中之一是,除非Resource Dictionaries被标记为“包含默认样式”,否则我们将不会查找它们。 存在一个缺陷:如果您所有的默认样式都嵌套在深度为三层或更深的合并字典中, 则顶级字典不会被标记,因此搜索将跳过它。 解决方法是在根Dictionary中添加一个默认样式以指定任何内容。

我看到你已经找到了解决方法,只需在App.xaml中添加一个默认的虚拟样式即可。它不必具有任何setter等,以下内容也可以:

<Application.Resources>
    <DataTemplate DataType="{x:Type vm:someviewmodeltype}">
        <vw:somevwcontrol />
    </DataTemplate>
    <Style TargetType="{x:Type Rectangle}" /> 
</Application.Resources>

花了一整天的时间寻找这个。问题已解决! - JvdBerg
这件事发生在我四年后的VS 2017中。 - SeraM

5

另一个容易犯的错误是在DataType属性中遗漏{x:Type}

错误示范

以下代码可以编译、运行但会默默失败:

<DataTemplate DataType="local:MyType">

正确

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

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