2009-06-24 6 views
3

im은 Silverlight 3 베타 탐색 응용 프로그램을 개발 중이므로 프리즘 및 물건을 사용하여 MVVM 패턴 :) (all-in-one viewmodel)을 약간 변형했습니다.ViewModel의 Silverlight 3 Beta, NavigationService

질문 : 어떻게 짧은 긴 이야기를 잘라 지금의 ViewModel

의 다른 "NavigationPage"로 이동 마십시오 뷰 모델은 페이지 리소스로 선언됩니다.

<navigation:Page.Resources> 
    <mvvm:LoginModel x:Key="DataSource" d:IsDataSource="True"></mvvm:LoginModel> 
</navigation:Page.Resources> 

그리고 명령이 내가 좋아하는 뷰 모델 어디서나 이동하려고하면

<Button x:Name="LoginButton" Width="100" Margin="8" Content="Login" 
     prism:Click.Command="{Binding LoginCommand}"/> 

지금 너무

this.NavigationService.Navigate(new Uri("/Views/About.xaml", UriKind.Relative)); 

Navigationservice가 null의 뷰 모델로 모든 것을 wireup하는 데 사용됩니다, 나는 주변을 둘러 보았고 네비게이션 0.3을 사용하여 설명하는 this 기사를 발견했다. 이것은 내비게이션 컨트롤이 존재하지 않았을 때 sl2 일에 다시 만들어졌다. elix의 모델이 잘 작동하고 viewmodel에 INavigationAware를 구현하면 NavigationContext에 액세스 할 수 있고 필요한 모든 작업을 수행 할 수 있습니다. 헬릭스를 시도하고 작동합니다.

SL3에는 내비게이션 지원 기능이 내장되어있어 말하자면 나선형 기능과 정확히 일치합니다. 그래서 제 3 자 프레임 워크를 사용하고 싶지 않습니다. 대신 내장 된 sl3 기능을 사용하는 것을 선호합니다.

나선의 INavigationAware 인터페이스를 에뮬레이트하는 SL3에는 어떤 것이 있습니까?

답변

4

내가 개인적으로 NavigationService가와 관련된 UI 개념이라고 생각 뷰 모델의 속성에 뷰 모델에 액세스하고 NavigationService를 설정 UI 프레임 또는 페이지

NavigationService를 뷰 모델로 전달하지 않고이 작업을 수행하는 또 다른 방법은 탐색을 수행해야 할 때 ViewModel에서 이벤트를 발생시키는 것입니다. 뷰에서 모델 모델 이벤트를 처리하고 응답으로 Navigate 호출 .

+0

100 % 동의합니다. ViewModel이 내비게이션을 요청할 때 발생하는 이벤트입니다. 뷰에서부터, 저는 이전 버전의 솔루션처럼 페이지 리소스에서 viewmodel에 액세스해야합니다.이 경우에는 ViewModel에 탐색 서비스를 추가하지 말고보기 만하십시오. 사건을 경청하고 조종 할 수있게, 맞습니까? – Neil

+0

네, 당신은 그것을 가지고 있습니다 ... NavigationService 같은 것을 뷰 모델에 전달할 필요가 없습니다. –

0

내 질문에 도움을 주어도 괜찮습니다. 아직 답변이 없기 때문에 더 많은 정보를 얻을 수 있습니다.

이 때문에 내가 도움이 다음보기로 이동 어차피,

public LoginModel() 
    { 
     LoginCommand = new DelegateCommand<object>(LoginCommandExecuted, a => { return _CanLoginCommandExecute; }); 
    } 

    public ICommand LoginCommand { get; private set; } 
    private bool _CanLoginCommandExecute = true; 
    private void LoginCommandExecuted(object parameter) 

    { 
     _CanLoginCommandExecute = false; 

     AdminClient client = new AdminClient(); 
     client.AuthorizeAsync(); 
     client.AuthorizeCompleted += 
     new EventHandler<AsyncCompletedEventArgs>(
       (s, e) => 
       { 
        if (e.Error != null) 
        { 
         MessageBox.Show("Login Failed"); 
        } 
        else 
        { 
         this.NavigationService.Navigate(new Uri("/Views/About.xaml", UriKind.Relative)); 
        } 
        _CanLoginCommandExecute = true; 
       } 
       ); 

    } 

NavigationService가 null의 뷰 모델에서 코드입니다!

+0

지금까지 찾은 해결책에 가장 가까운 것은 >> http : //blogs.southworks입니다.net/mconverti/2009/04/12/how-to-integrate-a-prism-v2-application-silver-3-navigation-framework/# 다운로드 – Neil

1

그러나 나는이 작업을 수행하는 데 사용할 수있는 유일한 방법입니다. 이 뷰 모델에서 나중에 사용할 수 있도록 뷰에서 OnNavigatedTo의 경우,

protected override void OnNavigatedTo(NavigationEventArgs e) 
     { 
      ViewModels.LoginViewModel viewmodel = (ViewModels.LoginViewModel)this.Resources["DataSource"]; 
//DataSource being the x:Name given to the viewmodel that is loaded as a page resource 
      viewmodel .service = NavigationService; 
     } 
0
NavigationService.Navigate(new Uri("/About", UriKind.Relative)); 

위가 작동해야합니다.

+0

ViewModel에서 NavigationService에 액세스 할 수 없으므로보기에서보기를 탐색 할 때보기가 이벤트를 구독해야하는 이유가 여기에 있습니다. MVVM에 대한 첫 번째 접근 방식입니다. – Neil

1

MVVM 표시등을 사용하는 경우 메시징 시스템 사용을 고려할 수 있습니다. 내비게이션을 수행하고보기 모델에서 nav 메시지를 보내는 프레임을 호스팅하는 페이지에 리스너를 갖습니다.

+0

이것이 현재의 전략입니다. , 감사 – Neil

관련 문제