2010-10-06 3 views
5

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

ответ

3

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

но возможно есть какое-либо решение с переопределением механизма передачи данных wpf?

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

+0

Идеальная идея на «markerview», я посмотрю, если это сработает ... –

+0

дайте мне знать, если это работает;) – blindmeis

5

Прекрасно работает при использовании идеи @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> 
+0

Спасибо, но лучше напишите var control = view as Control; control.DataContext = DataContext; Content = view; –

+0

Эй, Сергей, я искал решение для кэша просмотра и нашел вашу реализацию. Я не совсем понимаю, как получить доступ к модели представления из родительской модели просмотра. Нужно ли мне также обращаться к «ViewCache»? И как изменилось представление, которое затем реализовано в модели основного вида? – derape

Смежные вопросы