2016-11-28 189 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方法的用途。 –