2016-11-28 187 views
0

我有一個儀表板,它在調用構造函數時從數據庫中提取數據並相應地更新listbox。一旦我導航到新選項卡以將元素添加到數據庫並導航回儀表板,視圖不會更新。我定義了ObservableCollection,如果我例如從儀表板視圖內的列表中刪除元素,它的功能就很好。WPF Prism C#觀察數據庫更改並更新

由於我使用Prism,我已經實現INavigationAware儀表盤上,並以這種方式完成後,更新兩種方式都可以(刪除和添加新的),但問題是,其他財產,我需要一致少了點保持這種方式,因爲當我導航回到視圖時,整個ViewModel類再次實例化。

這裏的構造函數:

public DashboardViewModel() 
{ 
    service = new Service.ServiceManager(); 
    controller = ServiceController.GetServices().FirstOrDefault(x => x.ServiceName == service.ServiceName); 
    lbPlugins = new ObservableCollection<Plugin>(); 
    lbPlugins.AddRange(new DbRepository().GetContext().PluginSet); 
    StartStopInit(); 
} 

有可能通過程序來安裝一個雙贏的服務,和儀表板檢查該服務是啓動或停止模式:

private void StartStopService() 
{ 
    if (startStopTxt == "Start") 
    { 
     service.StartService(); 
    } 
    else 
    { 
     service.StopService(); 
    } 
} 

問題如果我執行INavigationAware服務會被覆蓋。我正在檢查它是否提取正確的名稱,它是...但它看起來像它生成一個新的實例,現在我能夠再次啓動服務......這不應該是可能的...

+0

您是否確實需要實施INavigationAware?如果你這樣使用它,那麼顯然ViewModel將被重新實例化。我建議在其他一些函數中啓動服務,而不是構造函數。也許在父類或加載事件中。 – ViVi

+0

嗯,我試圖避免它,但還沒有找到辦法做到這一點。我正在考慮做一些元素觀察數據庫的上下文屬性或什麼...更新數據庫時更改...但不知道它是否可能 – Norgul

回答

1

我看不到任何服務管理器的原因new。將它作爲單例註冊爲單元,並將其注入爲依賴項:

// in the bootstrapper/module initialization 
Container.RegisterType<ServiceManager>(new ContainerControllerLifetimeManager()); 

// in the view model's constructor 
public DashboardViewModel(ServiceManager serviceManager) 
{ 
    serviceManager.StartOrStopTheService(); 
} 
+0

同意@Haukinger,處理共享狀態,多個視圖的最佳方式取決於將其保存在服務中並將該服務注入ViewModels。否則,取決於您的代碼使用OnNavigatingTo和OnNavigatingFrom持久保存和加載。在這裏經常絆倒人們並沒有意識到,如果你的View被導航到一個區域,Prism RegionManager會持有對它的引用,所以你不會在視圖中獲得一個Loaded事件或者一個新的ViewModel構造當您導航並導航時 - 這就是INavigationAware方法的用途。 –