Можно ли кэшировать представление при использовании подхода «модель первый»? - PullRequest
5 голосов
/ 07 октября 2010

В нашем продукте мы используем первый подход к модели MVVM, и он работает хорошо, но с одной оговоркой. Когда представление становится сложным, требуется время для его создания из шаблона данных. Если вид часто отображается и скрывается, он становится немного раздражающим. Если сначала использовать представление, было бы достаточно просто кэшировать представление, если это необходимо, но при использовании DataTemplate и модели сначала мы не имеем большого контроля над созданием представления. Кто-нибудь уже решил эту проблему, не переключаясь на метод view first?

Ответы [ 2 ]

5 голосов
/ 02 ноября 2010

Прекрасно работает при использовании идеи @blindmeis.

Общий рецепт:

Создание ContentControl или UserControl с именем ViewCache:

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>
3 голосов
/ 08 октября 2010

при первом подходе к viewmodel, я думаю, у вас нет шансов «кэшировать» представление.таким образом, вы можете рассмотреть использование сначала вида и локатора viewmodel для тяжеловесных рабочих данных. здесь - это решение при использовании шаблонов данных со списками.

, но, возможно, есть какое-то решение с переопределением механизма шаблонов данных wpf?markerview "для вашей модели представления, поэтому wpf datatemplate может найти ее.и затем в этом маркерном представлении вы создаете / повторно определяете реальное представление?что-то вроде сервисного локатора вида?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...