2011-01-25 7 views
1

私はWPF、MVVM、Prism、およびMEFを使用しているアプリケーションで作業しています。MVVM、PRISM、およびMEFを使用して、ユーザーの要求なしでビューモデルからUIインタラクションを処理する方法

私は、リクエストナビゲーション付きのナビゲーション、リージョンマネージャを使用したビュー管理を備えたコントローラ、イベントアグリゲータ経由のイベントを組み合わせて1つのウィンドウでアプリケーションを実行しています。私はStock Trader RIがどのように働いているかに似た視点のアプローチを採用しています。 これは、UI(ビジーインジケータ)と対話するビューモデルコードがユーザーによって開始されたときに効果的ですが、背後で開始されると問題が発生する可能性があります。

これは実装が不適切なように思えますが、有効なシナリオがあると思います。私の特定の例は、ログインと関連しています。

現在、アプリケーションはシェルを起動して読み込みます。ログインビューは、シェルのメインコンテンツ領域にロードされます。ユーザが「ログイン」をクリックするとビジーインジケータが表示され、クライアントアプリケーションサービスのログインが実行されます。ログインが完了すると、ビジーインジケータが消え、画面はユーザのホーム画面にナビゲートされます。

ナビゲーションのログインとナビゲーションがログインボタンをクリックして開始されるため、これはうまくいきます。

これで、ユーザーが次回にアプリケーションを起動するときにログインビューが表示されず、ログインが舞台裏で行われるように、ユーザーがログインフォームで自動ログインを選択できるという新しい要件があります。

自動ログイン機能を呼び出すだけであれば、問題はありません。これは、それ自体でUIのやりとりがなく、正常に動作します。しかし、ログインには数秒かかり、ビジー状態のインジケータを表示したい。

問題はどこで自動ログイン呼び出しを開始するのですか?シェルビューモデルコンストラクタ?シェルビューモデルPartImportsSisisfied実装?これらの場所のいずれにおいても、シェルビュー(ビジーインジケータを含む)は実際にはまだロードされていません。その結果、地域や地域のマネージャーのような必要なリソースはありません。 それでは、私はこれを実装するための良い方法かもしれません:以前のユーザーならば

チェックすると、自動ログイン(この部分は考え出しました)

If yes then 
    Show busy indicator 
    Attempt to auto login 
    If auto login was success 
    Hide busy indicator 
    Navigate to user home screen 
    Else 
    Hide busy indicator 
    Navigate to login screen 
Else 
    Hide busy indicator 
    Navigate to the login screen 

任意のアイデアは大歓迎されている必要があります。

答えて

2

ShellViewModel内に、ロード可能であるという概念を扱うインターフェイスを実装します。 ShellViewModelのコンストラクタ内でこのロジックを実行しないでください。これは一般的に悪い方法であり、最大限オブジェクトをインスタンス化するために使用する必要があります。

public class ShellViewModel : ILoadable 
{ 
    public ShellViewModel() 
    { 

    } 

    bool ILoadable.Load() 
    { 
     //this is where you can take care of your auto login 
    } 
} 

これをBootstrapperクラス内で呼び出すことができます。これが別のモジュール内で実行されている場合は、IModule.Initializeメソッド内で呼び出すことができます。

また、このロジックは、上記のようにShellViewModelで呼び出すことができるサービス内に実装する必要があります。または理論的にはBootstrapperクラスから直接呼び出すことができます。 ShellViewModelは潜在的にサービス内からステートフルなデータを利用することができます。

+0

それは良い点です。現実的には私はこれらの場所を使わず、作曲中のPrism/MEFのエントリーポイントを説明するために使っていました。だから私の質問はあなたに戻っています。 ShellViewModelでILoadable.Loadを呼び出すのは何ですか? – BernicusMaximus

+0

@BernicusMaximus追加ポイントを追加しました... –

関連する問題