5

これまでのところ、アプリがあらゆる場所の一般的なクリックイベントハンドラーから完全なGUIデカップリングに移行する方法に本当に満足しています。今、私はよく理解できない何かに遭遇しています。それは、GUIをポップアップさせたいウィンドウに関連しており、モデルからの情報を表示する必要があります。

私の質問の短いバージョンは、MVVMでモデルがViewModelへの参照を持つことを許可することは絶対に禁止されているのでしょうか?これが私のシナリオです:RGB値を非常に速く循環するLEDのバンクがあります。GUIのウィンドウに、ViewModelを使用したデータバインディングを介して更新された色を表示したいと思います。テストアプリケーションでモックアップViewModelを使用してWindow+UserControlを正常に動作させていますが、このWindowを実際のアプリケーションに配置する必要があります。

私が実行している特定のモードは、ハードウェアの動作をシミュレートします。モデルに色を循環するように命令すると、必要なクラスメンバー変数の値を変更するスレッドが開始されます。

私の現在のMVVMの実装は、基本的に常にポーリングしています。他のLEDを他の場所で更新するために、ViewModelの関数を呼び出すスレッドを実行しています。これによりプロパティが更新されるため、データバインディングを使用しているため、GUIが自動的に更新されます。私のLEDの例の問題は、カラーシーケンスのシミュレーションがスレッドで行われることです。そのため、ViewModelで値をポーリングする必要がある場合、LED変数が過度にロックされるため、処理が遅くなる可能性があります。

したがって、誰かがこの問題に対する別のアプローチを推奨できることを望んでいます。これまでのところ、私が本当に考えることができるのは、WindowデータコンテキストをLEDViewModelにしてから、LEDViewModelをモデルに渡すことだけです。次に、RGBサイクリング関数を呼び出すと、必要に応じて必要なViewModelプロパティを変更できるため、ロックを使用する必要はまったくありません。

これは意味がありますか?何かアドバイスをいただければ幸いです。

4

3 に答える 3

7

INotifyPropertyChangedモデルにインターフェースを実装してみましたか?

これは十分に機能するはずだと私には思えます。モデルの色の状態が変化した場合、PropertyChangedイベントを発生させ、その通知からビューモデルの状態を更新し、ビューモデルのバインディングを介してビューを更新することができます。

于 2010-01-20T21:22:22.947 に答える
3

アプリケーションのある種のメッセージブローカーでイベントを使用してみませんか?

これを行う最も簡単な方法は、MVVMFoundationでMessengerを使用することです:http://mvvmfoundation.codeplex.com/

この例は次のとおりです。

public class MyHardwareModel
{
     private void OnHardwareLEDChanged() // or whatever
     {
          SharedMessages.Messenger.NotifyColleagues(SharedMessages.LEDCHANGED);
     }
}

次に、ビューモデルでスピンアップすると、ビューモデルのインスタンスが有効である間に、これらのメッセージの通知を登録します。

public class MyHardwareViewModel
{
     public MyHardwareViewModel()
     {
          SharedMessages.Messenger.Register(SharedMessages.LEDCHANGED, UpdateLeds);
     }

     private void UpdateLeds()
     {
          //Update ObservableCollection here.
     }
}

メッセージメディエーター/ブローカーパターンは、これらの状況で、これだけではありません。MVVMFoundationに組み込まれているMessengerは非常に強力です...私のサンプルでは、​​かなり一般的なメッセージを使用していますが、パラメーターを使用して、より多くの型付きメッセージを送信できます。

EventAggregatorと呼ばれる関数を使用している場合は、Prism / CompositeApplicationGuidanceに同様の関数が組み込まれています。同様の方法で使用されます。

お役に立てれば。

于 2010-01-21T04:39:18.913 に答える
0

簡単なアプローチは、定期的に、たとえば50ミリ秒ごとにポーリングを実行することです。これはタイマーを使用して非常に簡単に実行でき、スレッドからの継続的なポーリングよりもリソースの消費が少なくなります。ユーザーがとにかく色の変化を見る時間がないので、LEDが実際に速く循環する場合でも、50msは妥当な間隔のようです...

于 2010-01-20T21:49:39.547 に答える