2010-10-06 96 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

相關問題