app.xaml 中的数据模板在没有任何样式的情况下不会被拾取?

发布于 2024-10-14 05:21:47 字数 711 浏览 6 评论 0原文

我在 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>

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

谢谢。

I have a DataTemplate in app.xaml that binds a view to a viewmodel.

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

the above template doesn't get applied if there are no styles. The moment I put a style, something like ...

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

datatemplate gets picked up and produces the desired results ... I am not sure whats happening there ... could anybody clarify this ?

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

忘年祭陌 2024-10-21 05:21:47

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

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

关于每个对象的创建
XAML,如果存在默认样式
(即带有 Type 键的样式)
应应用样式。尽你所能
想象一下有几种表现
优化以实现这一点(隐含)
寻找重量尽可能轻的。一
其中之一是我们不向内看
资源字典,除非它们是
标记为“包含默认值
风格”。有一个错误:如果你所有的
默认样式嵌套在合并中
三层深度的字典(或
更深)顶级词典没有
被标记,因此搜索会跳过它。
解决方法是设置默认值
风格对某事,任何事,在
根词典。

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

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

Answered a similar question here. The question is not exactly the same, that one contained merged dictionaries being skipped but it's most likely the same bug.

This is an optimization bug, see this link.

On the creation of every object in
XAML, if a default style is present
(i.e. style w/ a key of Type) that
style should be applied. As you can
imagine there are several performance
optimizations to make that (implied)
lookup a light weight as possible. One
of them is that we don’t look inside
Resource Dictionaries unless they are
flagged as “containing default
Styles”. There is a bug: if all your
default styles are nested in merged
dictionaries three levels deep (or
deeper) the top dictionary does not
get flagged so the search skips it.
The work around is to put a default
Style to something, anything, in the
root Dictionary.

I see you've already found the workaround as well, just add a default dummy style in App.xaml. It doesn't have to have any setters etc, something like this will do as well

<Application.Resources>
    <DataTemplate DataType="{x:Type vm:someviewmodeltype}">
        <vw:somevwcontrol />
    </DataTemplate>
    <Style TargetType="{x:Type Rectangle}" /> 
</Application.Resources>
温柔少女心 2024-10-21 05:21:47

另一个陷阱是从 DataType 属性中遗漏了 {x:Type}

错误

:构建、运行并默默失败:

<DataTemplate DataType="local:MyType">

正确

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

Another pitfall is leaving out the {x:Type} from the DataType attribute.

WRONG

This builds, runs and fails silently:

<DataTemplate DataType="local:MyType">

RIGHT

<DataTemplate DataType="{x:Type local:MyType}">
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文