2014-05-16 1 views
0

저는 WPF/MVVM에 비교적 익숙하지 않습니다. 우리의 현재 WPF 프로젝트는 여전히 프로토 타입 어플리케이션이며, 이는 우리가 메인 레이아웃을 설계하지 않았다는 것을 의미합니다. 그러나 우리는 보고서를 디자인했습니다. 보고서에 따르면 UserControl은 각각 ComobBox 또는 TextBox과 같은 구성 컨트롤이 있고 일부는 DataGrid, Graph은 , ViewModel은 표시하려는 데이터에 대한 컨트롤이 있습니다. 아직 프로토 타입이므로 Window을 새로 열면 UserControl 중 하나가 표시됩니다. 앞으로는 Visual Studio의 레이아웃처럼 메인 윈도우 안의 다른 지역에 다른 UserControl을 배치하도록 변경할 수 있습니다. 가장 중요한 점은 우리의 어플리케이션에는 거의 백 가지의 그러한 UserControl 또는 우리가보고 한 것을 포함 할 것입니다. 따라서 정적 레이아웃/MainView를 사용했던 이전 작업 프로젝트와는 다릅니다.새 ViewModel을 사용할 수있는 시점에서 새보기 열기?

아직 좋은 아키텍처를 찾지 못했습니다. 우리의 고전적인 사용 시나리오는 사용자가 메뉴 보고서에서 선택할 수 있도록하는 것입니다. 따라서 우리는 Command (MainViewModel 또는 보고서의 ViewModel에서) 객체를 사용하여 새 보고서를 엽니 다. 그래서 기본적으로 Command은 새로운 ViewModel (ViewModel 첫 번째 경우)을 생성하고 이에 해당하는 View을 생성해야합니다 (누구에 의해 생성됩니까?). 새로 생성 된 UserControl을 포함하여 마지막으로 Window이 열립니다.

가 나는 두 가지 서비스가 필요 추측 : 새로운-뷰 모델 생성 이벤트를 구독

  1. 서비스를, 그리고 같은 이벤트가 발생할 때 UserControl를 해결.

  2. (현재 프로토 타입 응용 프로그램의 경우) 1) 서비스에 의해 게시 된 new-UserControl 생성 이벤트에 가입 한 다음이를 표시하는 새 창을 엽니 다.

그리고 나중에 실제 적용을 위해 2) 서비스를 변경하여 다른 지역에 배치 할 수 있습니다. 두 번째로, 간단하고 임시적인 것입니다. MainView의 코드 숨김에 EventAggregator을 사용하여 이벤트를 구독하고 Window을 새로 생성하는 객체를 하나만 가질 수 있습니다. 맞습니까?

누군가가 이것을 어떻게 달성해야하는지 말해 줄 수 있습니까?

+0

MEF를 살펴보십시오. http://msdn.microsoft.com/en-us/library/dd460648(v=vs.110).aspx. 그것은 1 차 서비스 (View는 ViewModel을 임포트 할 수 있습니다) 역할을 할 수 있습니다. – amnezjak

+0

@amnezjak 올바르게 이해하지 못할 수도 있습니다. 하지만 내 감정은 우리의 앱이'ViewModel'과 비슷하다는 것입니다. 예를 들어 하나의'ViewModel'에있는 하나의'Command' 객체가 실행되어 다른 다른'ViewModel'을 생성하고 그에 대한'View'를 해결해야합니다. . 그러나 당신의 제안에서,'View'는'ViewModel'을 수입합니다. BTW, 누가이 상황에서'보기'를 생성 할 책임이 있습니까? – tete

답변

2

데이터 바인딩이 이미 처리 할 수 ​​있습니다. 보고서를 표시하려는 컨테이너에서 ContentControl을 추가하고 현재 표시 할 보고서의 VM을 보유하는 등록 정보에 바인드하십시오.

<Window> 
    <ContentControl Content="{Binding Path=CurrentReport}" /> 
</Window> 

는 다른 보고서가 ContentControl에 주입 할 수 DataTemplate 자신의 UserControls의 각 포장 표시합니다. 보기를 실제로 해결하려면 몇 가지 선택 사항이 있습니다. DataTemplateSelector을 만들어 템플릿에 매핑하거나 템플릿에 VM 유형을 지정할 수 있습니다. 두 경우 모두 템플리트가 ContentControl의 범위에 있는지 확인하십시오 (동일 파일 또는 상위의 Resources 또는 독립형 ResourceDictionary에서 병합 됨).

<DataTemplate DataType="{x:Type viewModels:FirstReportViewModel}"> 
    <views:FirstReportViewControl/> 
</DataTemplate> 
+0

답장을 보내 주셔서 감사합니다. 하나 이상의 질문이 있습니다. 적어도 100 개 이상의 이러한 보고서/UserControl이 있으므로이 시나리오에서'DataTemplate'과'ReSources'가 좋은 선택입니까? 앞서 언급 한 것처럼 각 보고서는 개별 창에 표시되지만 창을 설정하고 다른 지역에 다른 보고서를 할당하여 실제 응용 프로그램에서 변경합니다. 이'DataTemplate' 메소드는 우리가 달성 할 수 있도록 일반적인 것입니까? – tete

+0

모두 예. 그 많은 템플릿으로 모든 것을 정리할 필요가 있지만이 솔루션에는 고유하지 않습니다. 보고서를 배치하는 데 필요한 것은 단 하나의 ContentControl 요소이므로 컨테이너를 변경하는 경우 특히 유용합니다. –

+0

감사! 나는 너의 요점을 얻은 것 같아. 나는 그것을 시도 할 것이다! – tete

0

존 보웬 (John Bowen)이 나에게 이길 뻔했다.

보기를보기 모델과 연결하려면 리소스 사전에서 데이터 템플릿을 사용할 수 있습니다.

<DataTemplate DataType="{x:Type vm:AllCustomersViewModel}"> 
    <vw:AllCustomersView /> 
</DataTemplate> 

이미 알고 계시 겠지만 리소스 사전에는 네임 스페이스를 설정할 수 있습니다. 이 예제에서 vw 및 vm은 각각 viewmodels 및 views가 들어있는 폴더를 참조합니다. 이제 콘텐트 컨트롤을 사용하여 뷰 모델에 바인딩하여 뷰를 생성 할 수 있습니다.

<ContentControl Content="{Binding SomeViewModel}" /> 

는 코드 위 부끄러움 BTW Josh Smith 도난되었다.

따라서보기를 viewmodel과 연결하기 위해 서비스를 필요로하지 않아야합니다. 프레임 워크가 당신을 위해 일하게하십시오. 실제로 새 창을 열지 않는 것이 좋습니다. 꼭 필요한 경우, "윈도우 컨트롤러"를 사용하십시오 - 어떤 종류의 서비스는 불가피합니다. 그러나 여러 개의 뷰 모델을 포함하는 단일 창을 고수하고 특정 이벤트를 받으면 교환하는 것이 좋습니다.

+0

답장을 보내 주셔서 감사합니다. 당신은 친절하게 나에게 그런 창 컨트롤러의 몇 가지 예를 줄 수 있겠습니까? 우리 SW는 내가 암시 한 것처럼 수백 개의 보고서를 포함하고 있으며 여러 보고서가 동시에 열리기 때문에 우리의 레거시 SW는 MDI (Multiple Document Interface)입니다. 우리가 다른 적절하고 적절한 레이아웃을 생각할 수 없다면, 필자는 여전히 WPF 애플리케이션에서 우리는 그러한 UI 배치를 따르기를 원한다. 예를 들어 Visual Studio (한 번에 하나의 문서 만있는 테이블 형식 컨트롤)는 필요하지 않습니다. – tete

+0

또한 현재 WPF 응용 프로그램은 프로토 타입이기 때문에 개별 창에서 다른 보고서를 열어 놓은 것입니다. 앞으로'View'와'ViweModel'을 다르게 사용하고 싶습니다. 그래서'DataTemplate' 메쏘드가 그 시나리오에서 사용되는 좋은 방법입니까? 내 감정은이 방법이 충분히 유연하지 않다는 것입니다 ... – tete