DataTemplate x:Shared=false对视图没有影响。

7
我正在使用datatemplate通过PRISM 4 Discovery加载我的视图。我需要多次创建视图/视图模型,而不是重用现有实例,因此我在资源中设置了x:Shared=false,但它仅在viewmodel上有影响。我可以确认viewmodel未被重用,但视图被重用。只有第一次调用时,才会调用视图构造函数一次。我已阅读了类似的帖子,但他们的解决方案对我没有起作用。我想知道是否可以扩展资源加载器/定位器,并确保它遵守Shared标志。
以下是我的模板定义方式:
 <DataTemplate DataType="{x:Type CVM:MyViewModel}" x:Shared="False">
        <V:MyView />
 </DataTemplate>

有没有无需更改设计的解决方法? - DotnetEng
不知道,没有使用过棱镜,也想不出什么优雅的东西。 - H.B.
在Prism中,您可以通过PartCreationPolicy属性来控制是否要使用单例。 Shared表示单例,NonShared表示新实例。您是否已经使用[PartCreationPolicy(CreationPolicy.NonShared)]装饰了您的视图? - Fredrik Hedblad
谢谢Meeleak,我刚刚测试了一下。它适用于viewmodel但不适用于view。view构造函数仍然只被调用一次。 - DotnetEng
1个回答

0

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

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

然而,如果您的 ItemsControl(包含您的视图模型)已开启虚拟化,则只能存在一个“容器”(在简化的术语中将成为您的数据模板),且可以被重复使用。


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