2016-11-28 1 views
0

생성자가 호출 될 때 DB에서 데이터를 가져 와서 listbox을 적절하게 업데이트하는 대시 보드가 있습니다. 새 탭으로 이동하여 요소를 DB에 추가하고 대시 보드로 다시 이동하면보기가 업데이트되지 않습니다. 나는 ObservableCollection을 정의했으며, 예를 들어 대시 보드보기의 목록에서 요소를 삭제하면 잘 작동합니다.WPF 프리즘 C#에서 DB 변경 및 업데이트 확인

내가 Prism을 사용하고 있기 때문에 대시 보드에 INavigationAware을 구현 했으므로이 방법으로 업데이트를 수행하면 삭제와 새로 추가가 가능하지만 문제는 다른 속성이 일관성이 필요하지 않다는 것입니다. 다시보기로 돌아 가면 전체 ViewModel 클래스가 다시 인스턴스화되기 때문에 그 상태를 유지하십시오.

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

문제 : 서비스 모드 시작에서 또는 중지하면

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(); 
} 

프로그램을 통해 승리 서비스를 설치할 수 있으며, 대시 보드 검사 : 여기

는 생성자 내가 INavigationAware을 구현하면 서비스가 어떻게 든 덮어 씁니다. 올바른 이름을 가져 오는 지 확인하고 있었는데 ...하지만 새로운 인스턴스가 생성 된 것처럼 보였습니다. 이제 다시 서비스를 시작할 수 있습니다 ... 가능하지 않아야합니다 ...

+0

실제로 'INavigationAware'가 구현되어 있습니까? 그런 식으로 사용하면 ViewModel이 다시 인스턴스화됩니다. 생성자가 아닌 다른 함수에서 서비스를 시작하는 것이 좋습니다. 어쩌면 부모 클래스 내부 또는로드 이벤트 중에. – ViVi

+0

글쎄, 나는 그것을 피하려고했지만, 아직 그것을 할 방법을 찾지 못했습니다. 일부 요소를 db 컨텍스트 속성 또는 뭔가 관찰 할 생각하고 있었다 ... db 변경 될 때 업데이트 할 수 있지만 ... 가능한 경우 알 수 없습니다 – 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을 일관되게 유지하고로드하는 것이 코드의 책임입니다. 사람들을 자주 방문하는 사람들은 당신의 뷰가 한 지역에서 네비게이션되고있는 경우, Prism RegionManager가이 뷰에 대한 참조를 가지고 있기 때문에 뷰에 Loaded 이벤트를 얻지 않거나 ViewModel을 새로 생성한다는 것을 인식하지 못합니다 네비게이션으로 돌아가서 돌아 다니면 INavigationAware 방법이 그 것이다. –