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>

数据模板被拾取并产生所需的结果......我不确定那里发生了什么......有人可以澄清一下吗?

谢谢。

4

2 回答 2

26

在这里回答了一个类似的问题。问题并不完全相同,其中一个包含被跳过的合并字典,但它很可能是同一个错误。

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

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

我看到您也已经找到了解决方法,只需在 App.xaml 中添加一个默认的虚拟样式即可。它不必有任何设置器等,这样的事情也可以

<Application.Resources>
    <DataTemplate DataType="{x:Type vm:someviewmodeltype}">
        <vw:somevwcontrol />
    </DataTemplate>
    <Style TargetType="{x:Type Rectangle}" /> 
</Application.Resources>
于 2011-01-27T07:11:15.807 回答
3

另一个陷阱是忽略了{x:Type}fromDataType属性。

错误的

这会默默地构建、运行和失败:

<DataTemplate DataType="local:MyType">

正确的

<DataTemplate DataType="{x:Type local:MyType}">
于 2020-09-20T22:37:39.800 回答