2009-06-24 10 views
3

私はSilverlight 3ベータ版のナビゲーションアプリケーションを開発していますので、プリムを使用して、MVVMパターン:)(オールインワンビューモデル)をわずかに変更しました。Silverlight 3 Beta、NavigationService in ViewModel

質問:どのように私は長い話を短くカットするために今のviewmodel

に異なる「NavigationPage」に移動しない、のviewmodelは、ページのリソースとして宣言されています。

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

そしてコマンドが、私はそう

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

のNavigationServiceがnullのようなのviewmodelのどこにでも移動しようとした場合のviewmodel

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

ですべてをwireupするために使用され、私は周りを見回して、ナビゲーションのためにヘリックス0.3を使用することを説明しているthisの記事を見つけました。これは、ナビゲーションコントロールが今まで存在していなかったsl2日に構築されましたelixのモデルはうまく動作し、ビューモデルにINavigationAwareを実装することで、NavigationContextにアクセスし、必要なものを何でも実行できます。ヘリックスを試してみました。

SL3には組み込みのナビゲーションサポートが付属しているので、まさにヘリックスの機能と同じです。だから私はサードパーティのフレームワークを使いたくないのですが、代わりにsl3の組み込み機能を使うのが好きです。

ヘリックスのINavigationAwareインターフェイスをエミュレートするSL3には何かがありますか?

答えて

4

のviewmodelで、後で使用することができるようにのviewmodel内のプロパティにのNavigationServiceを設定し、私は個人的のNavigationServiceは、関連付けられたUIコンセプトだと思いますUIフレームまたはページ。

NavigationServiceをビューモデルに渡すことなく、これを達成するもう1つの方法は、ナビゲーションが発生すると想定されるときにViewModelにイベントを発生させることです。ビューでビューモデルイベントを処理し、 。

+0

私は100%合意しました。 ViewModelがナビゲーションを要求したときに発生するイベント、次にViewから、ViewModelにナビゲーションサービスを追加するのではなく、Viewリソースに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のviewmodelのコードです!

+0

これまでのところ、これは私が見つけた解決策に最も近いものです>> http://blogs.southworks。net/mconverti/2009/04/12/how-to-integrate-a-prism-v2-application-the-silverlight-3ナビゲーションフレームワーク/#_ダウンロード – Neil

1

ドギーの修正ですが、この作業を行うために使用できるのは唯一のことです。ビューのOnNavigatedToイベントで 、ViewModelににアクセスし、それが

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へのアクセスがないため、ビューがビューをナビゲートしたいときにViewModelが起動するイベントにViewがサブスクライブする必要があります。これはMVVMへの最初のアプローチです – Neil

1

MVVMライトを使用している場合は、メッセージングシステムの使用を検討してください。ナビゲーションを行うフレームをホストするページ上にリスナーを配置し、ビューモデルからnavメッセージを送信します。

+0

これは私の現在の戦略です、ありがとう – Neil