在我们的产品中,我们使用MVVM模型的第一种方法,它很好地工作,但有一个警告。当视图变得复杂时,需要花时间从数据模板创建它。如果视图经常显示并隐藏,则会变得有些刺激。如果首先使用视图,如果需要缓存视图会很容易 - 但是当首先使用DataTemplate和模型时,我们对视图创建没有太多控制。 任何人都已经解决了这个问题,而没有切换到视图第一方法?使用模型优先方法时,可以缓存视图吗?
回答
with viewmodel first approach我认为你没有机会“缓存”视图。因此您可能会考虑首先使用视图和重量级数据模板工作流的视图模型定位器。 here是使用带有列表的数据模板的解决方案。
但也许有重写wpf datatemplate机制的任何解决方案?
编辑:如果您为viewmodel只创建一个“markerview”,那么wpf datatemplate可以找到它。然后在这个标记视图中创建/补充真实视图?像一个查看服务定位器?
如果使用@blindmeis想法,可以很好地工作。
的整体配方:
创建ContentControl中或用户控件命名视图缓冲:
public partial class ViewCache
{
public ViewCache()
{
InitializeComponent();
Unloaded += ViewCache_Unloaded;
}
void ViewCache_Unloaded(object sender, RoutedEventArgs e)
{
Content = null;
}
private Type _contentType;
public Type ContentType
{
get { return _contentType; }
set
{
_contentType = value;
Content = ViewFactory.View(value); // use you favorite factory
}
}
}
在DataTemplate中,使用视图缓冲,传递你想用真正的视图类型:
<Window.Resources>
<DataTemplate DataType="{x:Type TestViewCache:Foo}">
<TestViewCache:ViewCache ContentType="{x:Type TestViewCache:View }"/>
</DataTemplate>
</Window.Resources>
<StackPanel>
<ContentPresenter Height="200" Width="300"
Content="{Binding ViewModel}"/>
<Button Content="Set VM" Click="SetVMClick"/>
<Button Content="UnSet VM" Click="UnSetVMClick"/>
</StackPanel>
谢谢,但会写得更好 var control = view as Control; control.DataContext = DataContext; Content = view; – 2013-11-15 16:12:21
嘿,谢尔盖,我正在寻找视图缓存的解决方案,并找到你的实现。 我不太明白如何从父视图模型访问视图模型。我还必须访问'ViewCache'吗?那么在主视图模型中如何实现视图的变化呢? – derape 2015-02-09 15:32:40
- 1. 使用MEFedMVVM在父视图/视图模型中实现视图模型优先方法
- 2. 在视图模型中使用存储库可以吗?
- 3. 在1视图中有2个模型的方法,可以吗?
- 4. 如果视图被缓存,是否可以跟踪模型视图的视图?
- 5. 模型可以观察视图吗?
- 6. 模型可以刷新视图吗?
- 7. 是否可以在代码优先的模型中使用LinqPad
- 8. 使用EF4迁移工具和模型优先方法
- 9. 在模型优先方法中使用分页列表?
- 10. 使用动态模型的代码优先方法
- 11. 使用地图缓存模式视图
- 12. 轨道模型验证优先吗?
- 13. 模型优先vs数据优先EF
- 14. 使用大小模板优先于指针类型的方法的方法
- 15. Android可以缓存缓存清单HTML5视频离线吗?
- 16. 可以将Solr用作缓存的替代方法吗?
- 17. 我们可以以编程方式缓存谷歌地图吗?
- 18. 实体框架 - 混合模型优先和数据库优先的方法?
- 19. 我可以注释一个方法在Spring中可缓存吗?
- 20. 有什么方法可以更新视图中的模型?
- 21. UIPanGestureRecognizer优先于-touchesMoved:方法吗?
- 22. 我可以在drawRect方法中绘制时访问视图吗?
- 23. 优先上传优先级,以高优先级使用HTB qdiscs
- 24. 你可以缓存JNIEnv吗?
- 25. 你可以缓存UIViewControllers吗?
- 26. 我可以获得实体框架(模型优先)生成组合键吗?
- 27. 剃刀 - 我可以制作视图的可选模型吗?
- 28. 你可以让Quartz.Net使用优先级队列吗?
- 29. 我们可以在优先队列中使用字符值吗?
- 30. 使用实体框架数据库优先方法生成模型时的自动模型验证
对“markerview”的整洁的想法,我会看看它是否工作... – 2010-10-08 17:01:12
让我知道它是否工作;) – blindmeis 2010-10-08 18:01:10