【问题标题】:DataTemplate x:Shared=false has no impact on the viewDataTemplate x:Shared=false 对视图没有影响
【发布时间】:2015-12-16 18:00:11
【问题描述】:

我正在使用数据模板通过 PRISM 4 发现加载我的视图。我需要多次创建视图/视图模型而不是重用现有实例,因此我在资源中设置 x:Shared=false 但它只对视图模型有影响。我可以确认视图模型没有被重用,但视图是。视图构造函数仅在第一次调用时调用一次。我在这里读过类似的帖子,但他们的解决方案对我不起作用。我想知道我是否可以扩展资源加载器/定位器并确保它尊重共享标志。

这是我的模板的定义方式:

 <DataTemplate DataType="{x:Type CVM:MyViewModel}" x:Shared="False">
        <V:MyView />
 </DataTemplate>

【问题讨论】:

  • 任何解决方法都无需更改设计?
  • 不知道,没用过棱镜,实在想不出什么优雅的东西。
  • 在 Prism 中,您可以通过 PartCreationPolicy 属性控制是否需要单例。 Shared = 单例,NonShared = 一个新实例。你用[PartCreationPolicy(CreationPolicy.NonShared)]装饰你的视图了吗?
  • 谢谢 Meeleak,我刚刚测试过了。它适用于视图模型,但不适用于视图。视图构造函数仍然只调用一次。

标签: wpf prism-4


【解决方案1】:

所有DataTemplate 包含一个'Template',用于在对象(在您的情况下为视图模型)进入视野时创建必要的可视化树。

因此,如果只有一个 'MyViewModel' 对象在视图中,则视图的构造函数只会被调用一次(即使实例化了多个视图模型)。如果您的视图中有多个视图模型,则视图的构造函数将被多次调用,因为您的 DataTemplate 的模板被正确构造并添加到可视树中(每个视图模型一次)。

但是,如果您的 ItemsControl(保存您的视图模型)已打开虚拟化,则可能只存在一个“容器”(简而言之,就是您的数据模板),并且可以重复使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    • 2015-07-14
    • 1970-01-01
    • 1970-01-01
    • 2017-04-11
    • 1970-01-01
    相关资源
    最近更新 更多