我的WPF應用程序使用Caliburn.Micro作爲MVVM框架,實體框架作爲數據訪問技術。該應用程序的目的是維護數據庫。有多個Views
由菜單和結果數據網格組成。使用菜單控件用戶指定必須在結果數據網格中顯示哪些數據庫數據。部分ComboBox
es在不同Views
中綁定到相同屬性List<EntityName>
的ViewModels
(菜單有相同的項目可供選擇)。這些列表中的每個列表在ViewModel初始化時都從數據庫加載。我不想從每個視圖的數據庫加載相同的列表,我想要一次。爲了達到這個目的,我將這List
屬性移動到另一個類MenuLists
與PreloadLists()
方法從DB獲取列表一次,然後使用Caliburn的內置IoC容器將此類作爲單例注入到每個ViewModel。就像這樣:在MVVM應用程序中使用IoC容器按請求單例初始化
IoC容器配置:
container.PerRequest<KitchenOneViewModel>();
container.PerRequest<KitchenTwoViewModel>();
container.Singleton<IMenuLists, MenuLists>();
MenuLists
類:
public class MenuLists : IMenuLists
{
public List<Meat> MeatLst { get; set; }
public List<Fish> FishLst { get; set; }
public void PreloadLists()
{
using (var db = new DBEntities())
{
MeatLst = db.Meat.OrderBy(x => x.MeatName).ToList();
FishLst = db.Fish.OrderBy(x => x.FishName).ToList();
}
}
}
注入其在視圖模型:
public KitchenOneViewModel(IMenuLists menuLists)
{
_menuLists = menuLists;
}
的問題是,我需要調用MenuLists.PreloadLists()
莫名其妙,但如果我在MenuLists
consructor中這樣做,我會g在初始化ViewModel
時,會凍結較長的UI凍結,因爲MenuLists
的構造函數(具有昂貴的PreloadLists()
DB訪問操作)將被調用。我不知道View
會先打開,所以我不能打電話給PreloadLists
。我需要預先加載我的列表而不凍結UI。我該如何解決它?也許延遲MenuLists
初始化?
列表是否永遠不會改變?也許在「PreloadLists」函數中添加一個「加載」標誌,並檢查該標誌,如果其爲真,返回,如果不加載列表。然後,您可以在應用程序啓動時,或者作爲spash-screen操作的一部分在另一個線程中調用該函數(如果已經加載,您也可以在每個函數中調用它,但幾乎沒有影響)。你也可以有一個「ResetLists」函數重置加載的標誌,並重新加載列表,如果它更改... –