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

Ser*_*hov 5 wpf mvvm

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

Ser*_*hov 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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在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>
Run Code Online (Sandbox Code Playgroud)


bli*_*eis 3

使用视图模型第一种方法,我认为您没有机会“缓存”视图。因此,您可以考虑首先使用视图,然后使用视图模型定位器来实现重量级数据模板工作流程。是使用带有列表的数据模板时的解决方案。

但也许有任何解决方案可以覆盖 wpf 数据模板机制?

编辑:如果您为视图模型创建一个“markerview”,那么 wpf 数据模板可以找到它,该怎么办?然后在这个标记视图中创建/重新水化真实视图?类似查看服务定位器之类的东西?