在我們的產品中,我們使用MVVM模型的第一種方法,它很好地工作,但有一個警告。當視圖變得複雜時,需要花時間從數據模板創建它。如果視圖經常顯示並隱藏,則會變得有些刺激。如果首先使用視圖,如果需要緩存視圖會很容易 - 但是當首先使用DataTemplate和模型時,我們對視圖創建沒有太多控制。 任何人都已經解決了這個問題,而沒有切換到視圖第一方法?使用模型優先方法時,可以緩存視圖嗎?
回答
with viewmodel first approach我認爲你沒有機會「緩存」視圖。因此您可能會考慮首先使用視圖和重量級數據模板工作流的視圖模型定位器。 here是使用帶有列表的數據模板的解決方案。
但也許有重寫wpf datatemplate機制的任何解決方案?
編輯:如果您爲viewmodel只創建一個「markerview」,那麼wpf datatemplate可以找到它。然後在這個標記視圖中創建/補充真實視圖?像一個查看服務定位器?
如果使用@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>
謝謝,但會寫得更好 var control = view as Control; control.DataContext = DataContext; Content = view; – 2013-11-15 16:12:21
嘿,謝爾蓋,我正在尋找視圖緩存的解決方案,並找到你的實現。 我不太明白如何從父視圖模型訪問視圖模型。我還必須訪問'ViewCache'嗎?那麼在主視圖模型中如何實現視圖的變化呢? – derape 2015-02-09 15:32:40
- 1. 使用MEFedMVVM在父視圖/視圖模型中實現視圖模型優先方法
- 2. 在視圖模型中使用存儲庫可以嗎?
- 3. 在1視圖中有2個模型的方法,可以嗎?
- 4. 如果視圖被緩存,是否可以跟蹤模型視圖的視圖?
- 5. 模型可以觀察視圖嗎?
- 6. 模型可以刷新視圖嗎?
- 7. 是否可以在代碼優先的模型中使用LinqPad
- 8. 使用EF4遷移工具和模型優先方法
- 9. 在模型優先方法中使用分頁列表?
- 10. 使用動態模型的代碼優先方法
- 11. 使用地圖緩存模式視圖
- 12. 軌道模型驗證優先嗎?
- 13. 模型優先vs數據優先EF
- 14. 使用大小模板優先於指針類型的方法的方法
- 15. Android可以緩存緩存清單HTML5視頻離線嗎?
- 16. 可以將Solr用作緩存的替代方法嗎?
- 17. 我們可以以編程方式緩存谷歌地圖嗎?
- 18. 實體框架 - 混合模型優先和數據庫優先的方法?
- 19. 我可以註釋一個方法在Spring中可緩存嗎?
- 20. 有什麼方法可以更新視圖中的模型?
- 21. UIPanGestureRecognizer優先於-touchesMoved:方法嗎?
- 22. 我可以在drawRect方法中繪製時訪問視圖嗎?
- 23. 優先上傳優先級,以高優先級使用HTB qdiscs
- 24. 你可以緩存JNIEnv嗎?
- 25. 你可以緩存UIViewControllers嗎?
- 26. 我可以獲得實體框架(模型優先)生成組合鍵嗎?
- 27. 剃刀 - 我可以製作視圖的可選模型嗎?
- 28. 你可以讓Quartz.Net使用優先級隊列嗎?
- 29. 我們可以在優先隊列中使用字符值嗎?
- 30. 使用實體框架數據庫優先方法生成模型時的自動模型驗證
對「markerview」的整潔的想法,我會看看它是否工作... – 2010-10-08 17:01:12
讓我知道它是否工作;) – blindmeis 2010-10-08 18:01:10