티스토리 뷰

반응형

이번회에는 메인 메뉴, 상단 메뉴들과 각 화면을 연결 시키는 방법에 대해서 알아보도록 하자. 우선 전체적인 흐름에 대해 먼저 정리를 하고, 각 순서에 따라서 소스 받아서 따라가보면 상세한 내용을 파악할 수 있다. (여기 저기 수정을 해서 어디를 얼만큼 수정했는지 기억이 않나는;;;)

1. 전체적인 흐름

1) Loading & 메인 메뉴 클릭 & 게시판 관리 & 회원 관리
MainPage.xaml : 해당 Command 실행  -> MainPageViewModel.cs : 해당 Command 실행
-> CurrentViewName 프로퍼티 설정 : OnPropertyChaned 발생
-> MainPage.xaml.cs : MainPageVM_PropertyChanged 에서 CurrentViewName에 대한 처리
-> MainPageVM.CurrentViewName에 있는 화면을 CurrentView 프로퍼티에 넣는다.
-> MainPage.xaml에 있는 ContentControl의 Content는 MainPagVM.CurrentView에 바인딩되어 있어서, 화면이 변경된다.

2) 왜 이런 복잡한 단계를 거치게 만들었는가?
일단..뷰와 뷰모델은 서로 직접적인 연결관계가 없는 Loosely Coupled 관계를 유지 해야하고, 뷰모델에서 다른 뷰들의 인스턴스 객체를 가지고 있지 않기 위해서 약간 복잡한 구조를 가지도록 만들었다. 그러나, 처음에만 좀 복잡하게 느낄 뿐이지 실제 프로젝트에서는 이런 식으로 자주 사용 된다.
MVVM + WCF RIA Service 일때 데이터가 비동기로 처리되기 때문에 데이터가 오기전에 뷰에서 먼저 이벤트가 발생해서, 특정 처리가 완료가 않되었을 경우, 모델에서 이벤트를 발생시켜서 뷰에서 다시 처리를 하도록 시키는 경우가 필요하기 때문이다.

 3) 뷰들은 왜 Import 시키지 않았나?
모든 뷰들도 [Export(typeof(UserControl))]을 사용해서 Export시킬 수가 있다. 그런데 그렇게하면 뷰안에서 사용했던, CompositionInitializer.SatisfyImports(this); 명령을 사용할 수 없고, 그렇게 되면, 각 뷰 내부에서 임포트를 시킨 ViewModel을 약간 다른 방법으로 임포트를 시켜야 하고 또 다시 뷰모델 내부에있는 모델을 임포트 하는 방법도 약간 바꿔야 한다.( Prism/MEF Container 방식을 참고 하면 된다.) 그러다보니, 소스를 너무 만이 수정을 해야해서, 여기서는 각각의 뷰들을 가상 프로퍼티로 만들어서 사용했다.

 4) 메인 컨텐츠에서 사용했던 ItemsControl을 왜 ContentControl로 변경했나?
temsControl을 사용하면 여러개의 컨텐츠를 계속 붙여가면서 보여줄 수 있다. 그러나, 지금 이 프로젝트처럼 여러개의 뷰를 붙이는 작업을 하게되면, 각 뷰의 높이를 파악할 수 없어서, 뷰 내부 컨텐츠를 위한 세로 스크롤바를 만들 수가 없다.(그냥 화면 자체가 길어져 버린다..스크롤 바도 없이) 그래서 한번에 하나의 뷰만을 보여주기 위해서 ContentControl로 변경 했다. 상단에 있는 회원 관리 화면을 보면 쉽게 이해가 갈 것이다.

 2. 여러가지 방법을 생각하고,
만들어 본다고 강좌가 좀 늦어졌다...그러나.. 아무도 강좌가 언제 올라오는지 궁금해 하지 않아서..더 늦어진 것인지도 모르겠다..^^;;; 요즘은 리플도 없어지고..점점 관심을 잃어가는 것같은데..낚시글이라도 올려야 하나..라는 생각을 가끔하게 된다. 작은 리플 하나가 큰 힘이 된다~
(소스는 용량관계로 실버라이트 소스만 올리도록 하겠다. 다음회에 올릴 상세 페이지 소스도 함께 들어 있다.)

반응형
댓글