2010-03-26 9 views
1

저는 WPF 및 MVVM을 처음 사용하며 두 가지 모두를 활용하는 응용 프로그램을 작성하고 있습니다. 응용 프로그램은 Windows 탐색기와 유사하므로 메뉴가 포함 된 주 창 (ShellViewModel), 트리 컨트롤 (TreeViewModel) 및 목록 컨트롤 (ListViewModel)이있는 응용 프로그램을 고려하십시오. 편집 (Edit) -> 삭제 (Delete)와 같은 메뉴 항목을 구현하여 현재 선택된 항목 (트리 또는 목록에있을 수 있음)을 삭제합니다.WPF에서 현재 선택에 의존하는 메뉴 항목을 구현하는 방법 MVVM 탐색기와 유사한 응용 프로그램

Josh Smith의 RelayCommand를 사용 중이며 ShelluitModel의 MenItem을 DeleteItemCommand에 바인딩하는 것은 쉽습니다. 그러나 DeleteItemCommand를 구현하는 것처럼 보이지만 포커스/선택을 추적하고 구현을 위해 적절한 자식에게 작업을 지시하기 위해 ShellViewModel과 두 자식 뷰 모델 (TreeViewModel 및 ListViewModel)간에 상당히 긴밀한 결합이 필요합니다. 그건 나에게 잘못된 것처럼 보이고 내가 뭔가를 놓치고 있다고 생각하게 만든다.

부기를 수행하기 위해 포커스 관리자 및/또는 선택 관리자를 작성하는 것이 그리 어려운 일은 아니며 클래스를 함께 연결하지 않고도 수행 할 수 있습니다. 윈도우 시스템은 이미 어떤 뷰에 포커스가 있는지 추적하고 있으며 코드를 복제하는 것처럼 보입니다.

내가 모르는 부분은 ShellViewModel에서 ListViewModel 또는 TreeViewModel으로 명령을 라우팅하여 코드 엉망을 만들지 않고 실제 작업을 수행하는 방법입니다. 언젠가 두 명 이상의 어린이를 포함하도록 신청서가 연장 될 것이며 가능한 한 어린이의 연장을 가능한 한 아프게 할 수 있도록 껍질을 어린이들에게 알리고 싶습니다.

일부 샘플 WPF/MVVM 응용 프로그램 (Karl Shifflett 's CipherText, Josh Smith's MVVM Demo 등)을 보면이 작업을 수행하는 코드를 보지 못했습니다. 또는 이해하지 못했습니다.

내 접근 방식이 근거가 없다고 생각하든, 약간의 뉘앙스가 누락 되었는가에 관계없이 의견을 공유하고 다시 정상적으로 돌아 오도록 도와주세요. 감사!

답변

1

조쉬 스미스 (Josh Smith)의 MVVM 구현에는 몇 가지 고유 한 문제가 있습니다. 제목에 대한 와드 벨의 게시물을보십시오 : http://neverindoubtnet.blogspot.com/2010/03/mvvm-josh-smiths-way.html. ViewModel의 첫 번째 방법을 사용하고이 결합을 끊는 Caliburn과 같은 일부 대체 MVVM 프레임 워크를 살펴볼 수 있습니다.

+0

Ward Bell의 게시물에 대한 링크를 제공해 주셔서 감사합니다. 나는 그것이 내 질문에 어떻게 적용되는지 100 % 확실하지 않다.내 문제의 가능한 해결책으로 Event Aggregation에 대한 참조를 언급하고 있습니까? – Doug

+0

예, 서로 다른 ViewModel 간의 통신 수단으로 Event Agg를 사용해야합니다. 그들은 서로에 대한 어려운 언급을해서는 안됩니다. MVVM 아키텍처 개요에 대한 또 다른 좋은 참고 자료는 Rob Eisenberg의 Mix 10에서 자체 MVVM 빌드 (http://live.visitmix.com/MIX10/Sessions/EX15)입니다. –

0

RelayCommand는보기에 바인딩 할 수있는 ViewModel에서 명령을 가져 오는 방법 일뿐입니다.

다른 MVVM 아키텍처 변형과 샘플 응용 프로그램에서 모두 물러나고 좋은 오래된 OOD를 사용하고 싶습니다. 왜 TreeViewVm과 ListViewVm을위한 ViewModel 기본 클래스 (즉, DetailsViewModelBase)를 가지지 않을까요? 거기에 DeleteCommand를 넣으십시오. CanDelete와 Delete 메서드는 하위 클래스 공유 (또는 없으면 추상화) 및 SelectedItem만큼 많은 구현을 갖습니다. selectedItem가와 IsSynchronizedWithCurrentItem되는

<ListView AlternationCount="2" MinHeight="250" MaxHeight="400" 
      ItemsSource="{Binding Projects.View}" 
      IsSynchronizedWithCurrentItem="True" 
      SelectedItem="{Binding SelectedProject, Mode=TwoWay}" 
      behaviors:SelectionBehavior.DoubleClickCommand="{Binding PickCommand}" 
      ItemContainerStyle="{StaticResource listingRowStyle}" 
         > 

키 바인딩 : 그런 다음 아래의 XAML과 유사한 컨트롤에 selectedItem가 바인딩합니다.

HTH,

0


Berryl 나는 그가 ActiveAwareCommand를 부르는 것을 설명하는 켄트 Boogaart하여 blog post을 발견했다. 이것은 내가 아직 시도하지는 않았지만 내가 찾고있는 것을하는 것처럼 보인다. 이 게시물에 대한 의견은 Prism의 IActiveAware가 유사한 동작을한다고 언급합니다.