使用模型第一种方法时是否可以缓存视图?

时间:2010-10-06 23:22:27

标签: wpf mvvm

在我们的产品中,我们使用MVVM模型的第一种方法,它很好地工作,但有一点需要注意。当视图变得复杂时,从数据模板创建它需要时间。如果经常显示和隐藏视图,它会变得有点刺激。如果首先使用视图,那么在需要时缓存视图会很容易 - 但是当首先使用DataTemplate和模型时,我们对视图创建没有太多控制。 有没有人在没有切换到第一种方法的情况下解决了这个问题?

2 个答案:

答案 0 :(得分:5)

如果使用@blindmeis的想法,可以很好地工作。

整体食谱:

创建名为ViewCache的ContentControl或UserControl:

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中,使用ViewCache,传递您要使用的真实视图的类型:

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

答案 1 :(得分:3)

使用viewmodel第一种方法我认为你没有机会“缓存”视图。因此,您可以考虑首先使用view和viewmodel定位器来进行重量级datatemplates工作流。将{datatemplates与列表一起使用时,here是一种解决方案。

但也许有任何解决方案覆盖wpf datatemplate机制?

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