2010-10-06 93 views
5

在我们的产品中,我们使用MVVM模型的第一种方法,它很好地工作,但有一个警告。当视图变得复杂时,需要花时间从数据模板创建它。如果视图经常显示并隐藏,则会变得有些刺激。如果首先使用视图,如果需要缓存视图会很容易 - 但是当首先使用DataTemplate和模型时,我们对视图创建没有太多控制。 任何人都已经解决了这个问题,而没有切换到视图第一方法?使用模型优先方法时,可以缓存视图吗?

回答

3

with viewmodel first approach我认为你没有机会“缓存”视图。因此您可能会考虑首先使用视图和重量级数据模板工作流的视图模型定位器。 here是使用带有列表的数据模板的解决方案。

但也许有重写wpf datatemplate机制的任何解决方案?

编辑:如果您为viewmodel只创建一个“markerview”,那么wpf datatemplate可以找到它。然后在这个标记视图中创建/补充真实视图?像一个查看服务定位器?

+0

对“markerview”的整洁的想法,我会看看它是否工作... – 2010-10-08 17:01:12

+0

让我知道它是否工作;) – blindmeis 2010-10-08 18:01:10

5

如果使用@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> 
+0

谢谢,但会写得更好 var control = view as Control; control.DataContext = DataContext; Content = view; – 2013-11-15 16:12:21

+0

嘿,谢尔盖,我正在寻找视图缓存的解决方案,并找到你的实现。 我不太明白如何从父视图模型访问视图模型。我还必须访问'ViewCache'吗?那么在主视图模型中如何实现视图的变化呢? – derape 2015-02-09 15:32:40

相关问题