2009-07-05 8 views
7

私は小さな概念実証アプリケーションを続けています。これは主に、Silverlight内のMVVMスキルを強化することです。私は今日、MVVMのやり方を解決する方法を考え出すことができなかった興味深い問題に出くわしました。私は検索中に関連する何かを見つけることに成功しなかった。MVVMとSilverlightを使用した「待機」画面の一般的な方法

この問題では、データベースのバックエンドを持つシンプルなビジネスタイプのアプリケーションがあります。私は、ログインを実行し、成功または失敗を報告するログインビューとビューモデルを添付しています。問題ない。私がまだ満足していないのは、ユーザーに待機画面を報告する方法です。私のログイン画面では、ユーザーはログインをクリックし、データベースチャットが行われている間に数秒の遅延があります。私はこれを報告し、呼び出しが完了するまで相互作用を無効にしたいと思います。

私にはいくつかのアイデアがありました。まず、Cursorプロパティをviewmodelにバインドすると、VMはIsBusyプロパティをtrueに設定できます。これの問題は、私はUserControl(Visual StudioはAG_E_RUNTIME_MANAGED_UNKNOWN_ERRORと言う)のCursorにバインドできないようだということです。

第2のアイデアは、待機画面を持つことです。あなたが知っている、小さな歯車の回転や、あなたが望むアニメーション。それは問題ありませんが、Xamlを使ってモデルを使ってビューをどのように切り替えることができるかは、私にとっては本当のことではありません。私は間違いなくイベントをフックし、これをコードで処理できることを知っています。多分それは行く方法ですか?ちょっとだけ、MVVMのグレインとは思えません。

これを処理する方法の詳細については、興味がありますか。

ありがとうございます。

答えて

1

私たちは、長時間実行要求を処理するためのサービスを使用して終了しました。このサービスはワークロードをデリゲートとして取り込み、それをBackgroundWorkerに渡します。同時に、「しばらくお待ちください」ビューを開きます。

これは、私たちがすべてのViewModelで長時間実行されているプロセスを、同じように、非常に簡単なインタフェースで制御できるようにするうえで機能します。

遅延を必要とする場合、ViewModelからのイベントがViewを更新する可能性がありますが、このコードをすべてのViewModelに含める必要があり、より簡単にメンテナンスできる単一のクラスではありません。

EDITサービスは、IOCコンテナ内に登録されたクラスで、ViewModelsで使用できます。

public interface IProcessingService 
{ 
    void Process(Action<BackgroundWorker> action); 
    void Process(Action<BackgroundWorker> action, 
     Action<RunWorkerCompletedEventArgs> finish); 
} 

これを使用すると、ViewModelをこのように実装できます。進捗通知を表示するための

{ 
    var processingService = container.Resolve<IProcessingService>(); 
    processingService.Process(worker => 
    { 
     worker.ReportProgress(0, "Please wait..."); 
     // Do work here 
     worker.ReportProgress(50); 
     // Do more work 
     worker.ReportProgress(100); 
    }); 
} 

この方法で、すべてのコードがIProcessingServiceを実装するクラスであり、あなたの意見は、直接ビューまたは任意のUI要素を制御するコードの無料のまま。

+0

ちょっと精巧にお考えですか?あなたが「サービスを使って終わった」と言うと、私はそれほどフォローしません。明らかに、私はプロセスを処理するためにwcfサービスを使用しています、SLはサービスを非同期的に呼び出します。あなたはwcfサービスを呼び出す別のサービスがあると言いますか? 「待機」画面/コードを1か所に配置するというアイデアは本当に好きですが、これは最終的には後になっています。 – billb

0

Josh Smithが作成したMediatorプロトタイプを使用して、VMからVへの緩やかに結合されたメッセージングシステムを使用できます.VMは、この「IsBusy」に購読しているビューで「ビジー」であるというメッセージを送り出すことができます"メッセージ。

「IsNotBusy」メッセージが受信されるまで、ビューは正しいダイアログを表示することができます。

もう1つの方法は、ダイアログを表示するメソッドを持つIDialogProviderのようなインタフェースをコンストラクタのViewModelに渡すことです。このプロバイダの実装はビュー固有のものになりますが、少なくともビューモデルはインターフェイスのみを認識し、具体的な実装は認識しません。

public interface IDialogProvider 
{ 
void ShowErrorMessage(string message); 
} 

Mediator Prototype

+0

は返事をありがとうございました。私は数回メディエーターの記事を読んで、私はそれを得ると思う。しかし、それは過度のようだ。私はIDialogProviderが好きですが、私は1点について自分自身と戦っています。本当にUIを表示するビューモデルの責任はありますか?表示されていない場合は、単にビューを購読してそれに応じてUIを表示させるイベントを持たないのはなぜですか? – billb

+0

ビューを使用してVM上のイベントにバインドする場合、最初にVMを持つ理由IDialogプロバイダは、ダイアログが必要であることをViewに知らせるための任意のインターフェイスです。 ShowErrorMessageは、適切と思われるものに置き換えることができます。 –

3

私はSilverlightのツールキットでBusyIndi​​catorを使用することをお勧めします

...他の人がこれを「overthinking」かもしれないと思います。

シンプルXAML:

<toolkit:BusyIndicator Name="busyBoy" IsBusy="true" BusyContent="Fetching Data..." Margin="6,248,0,0" /> 
関連する問題