2015-04-20 124 views
0

我的WPF應用程序使用Caliburn.Micro作爲MVVM框架,實體框架作爲數據訪問技術。該應用程序的目的是維護數據庫。有多個Views由菜單和結果數據網格組成。使用菜單控件用戶指定必須在結果數據網格中顯示哪些數據庫數據。部分ComboBox es在不同Views中綁定到相同屬性List<EntityName>ViewModels(菜單有相同的項目可供選擇)。這些列表中的每個列表在ViewModel初始化時都從數據庫加載。我不想從每個視圖的數據庫加載相同的列表,我想要一次。爲了達到這個目的,我將這List屬性移動到另一個類MenuListsPreloadLists()方法從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初始化?

+1

列表是否永遠不會改變?也許在「PreloadLists」函數中添加一個「加載」標誌,並檢查該標誌,如果其爲真,返回,如果不加載列表。然後,您可以在應用程序啓動時,或者作爲spash-screen操作的一部分在另一個線程中調用該函數(如果已經加載,您也可以在每個函數中調用它,但幾乎沒有影響)。你也可以有一個「ResetLists」函數重置加載的標誌,並重新加載列表,如果它更改... –

回答

1

要麼懶洋洋地逐一加載每個列表以減少初始化的時候,是這樣的:

//only initialized when it's used 
private static Lazy<List<Meat>> meatList 
    = new Lazy<List<Meat>>(
      () => 
      { 
       //load single list here 
      } 
    ); 
public List<Meat> MeatList { get{ return meanList.Value; } } 

...或者,如果你想一次當你啓動應用程序,而不是等待的初始化一切,這樣做ViewModels被實例化。

或者,如果您不需要阻止,則可以考慮初始化爲async

+1

'懶惰'正是我想要的。謝謝! – AsValeO

相關問題