2012-05-30 4 views
0

저는 Silverlight 프로젝트 (Silverlight 4.0)를 처음으로 시작하려고합니다. MVVM을 사용할 예정이며 지난 며칠간 탐색을 보면서 시간을 보냈습니다.Navigate 서비스가있는 Silverlight에서 MVVM을 구현하려면 어떻게해야합니까?

우선, 많은 MVVM 예제가 MainPage를 뷰/뷰 모델로 구현하지 않는다는 것을 알아 챘습니다. 메인 페이지에는 탐색 프레임과 Uri 매핑이 포함되어 있으며 뷰/뷰 모델을 따르는 페이지로 이동합니다. 메인 페이지가보기 /보기 모델로 구현되지 않은 MVVM 및 탐색 서비스를 사용할 때 표준입니까? 예를 들어, Silverlight 4 교육 키트에는 이벤트 관리자 샘플이 들어 있으며 Main Page에는 Navigated 및 NavigatedFailed와 같은 탐색 이벤트를 처리하는 코드가 많이 있습니다. 하지만 다른 모든 페이지는보기 /보기 모델입니다.

둘째, 네비게이션 서비스를 사용하면 탐색을 변경하는 논리가 이제보기에서 수행되고보기 모델에 의해 제어되지 않습니다 (MVVM의 일부 아이디어에 위배됩니다). 그물에 대한 접근법 중 일부는 ViewModel에서 View 로의 메시징을 사용하거나 Navigation 서비스를 ViewModel 및 거기에서 제어되는 내비게이션으로 전달합니다. 이 접근법 중 하나가 다른 접근법보다 우수합니까?

이상적으로는 메인 페이지가 View/ViewModel을 따르고 ViewModel이 탐색을 제어하고보기에 코드 숨김이없는 예제를 찾고 싶습니다. 내가 너무 많이 묻는거야 ??!

참고 PRISM 또는 MVVM Light를 사용하고 있지 않습니다.

건배

답변

0

내 프로젝트에서는 MainPage 내부에 컨테이너를 만들었고 모든보기가로드되었습니다. 이렇게하면 코드 숨김에 코드를 넣을 필요가 없습니다. 메인 페이지가 App의 RootVisual로 시작되면 MainPage는 쉘을 생성 한 클래스 인 DataContext로 수신합니다. 컨테이너는이 클래스에서 DP를 받고 셸의 이벤트를 사용하여 뷰를로드합니다. 여기

컨테이너의 코드이다

<ContentControl Name="region1ContentControl" Content="{Binding Path=MainContent}" Style="{StaticResource ContentControlStyle}" Grid.Row="1" Margin="0,30" /> 

MainContent 특성 :

public static readonly DependencyProperty MainContentProperty = 
     DependencyProperty.Register("MainContent", typeof(System.Windows.Controls.Control), 
     typeof(MainPagePresenter), null); 
    public System.Windows.Controls.Control MainContent 
    { 
     get { return (System.Windows.Controls.Control)GetValue(MainContentProperty); } 
     set { SetValue(MainContentProperty, value); } 
    } 

쉘 +보기가

로드되는 경우
var presenter = (Bxf.IPresenter)Bxf.Shell.Instance; 

     presenter.OnShowView += (view, region) => 
     { 
      if (region.Equals("MainContent", StringComparison.InvariantCultureIgnoreCase)) 
       MainContent = view.ViewInstance; 
      else if (region.Equals("DetailContent", StringComparison.InvariantCultureIgnoreCase)) 
       DetailContent = view.ViewInstance; 
      else 
       throw new ArgumentException(string.Format(AppStrings.InvalidRegionName, region)); 
     }; 

코드 숨김 MainPage :

public partial class MainPage : UserControl 
{ 
    public MainPage() 
    { 
     InitializeComponent(); 
    } 
} 

본 적이 있습니까? 참고 : 프리즘이나 MVVM 라이트도 사용하고 있지 않습니다.

+0

안녕하세요 Vinicius, 답장을 보내 주셔서 감사합니다. 약간 혼란 스럽네요 - 당신의 메인 페이지는 상응하는 ViewModel을 가지고 있습니까? 내비게이션이 어떻게 통제되는지에 관해서도 나는 잃어버린다. 사용자가 브라우저에서 앞으로/뒤로 클릭하면 ViewModel에서 아무 것도 실행됩니까? – rockshire

+0

우리의 내비게이션은 시간당 하나의보기로 제한됩니다. 하나의보기를로드하면 다른보기가 닫힙니다. 우리 MainPage는 MainPage의 DataContext로서 전달되는 상응하는 ViewModel (우리가 쉘을 생성 한 곳)을 가지고 있습니다. 거기에서 원하는대로 할 수 있습니다. – Vinicius

관련 문제