GUIを書くとき、私は頻繁に次の問題を克服しています。モデルとコントローラがあるとします。コントローラにはモデルのX
プロパティを表示するために使用されるウィジェットW
があります。GUIのイベントサイクルを中断する
コントローラーの外からモデルが変更される可能性があるため(同じモデルを使用する他のコントローラーがある場合や操作の取り消しなど)、コントローラーはモデルの変更を待ち受けます。コントローラはまた、ウィジェットW
のイベントをリッスンし、それに応じてプロパティX
を更新します。今
、次の処理が行われます
- 値
W
にイベントが発生し - 変更され、コントローラにおけるハンドラは新しい値を設定
- コントローラが起動され
X
はモデル - m odelは、コントローラがコントローラが
X
の値が取得 - モデルから変更イベントを受信
- 変更されているので、イベントを放出し、ウィジェット
- ジャンプ1 に設定します
そのためのいくつかの可能なソリューションがあります。
- モデルが更新されたときにフラグを設定し、このフラグが設定されている場合はモデルからのイベントに反応しないようにコントローラを変更します。
- 外し、一時的にコントローラ(またはいくつかの時間のための任意のイベントを送信していないモデルを伝える)
- 過去にウィジェット
から更新をフリーズそれはだから、私は通常、オプション1のために行ってきました最も簡単なこと。それは、フラグでクラスを混乱させるという欠点がありますが、他のメソッドにも欠点があります。
私はGTK +、Qt、SWTなどのいくつかのGUIツールキットでこの問題を抱えていたので、かなりツールキットには依存しないと思います。
ベストプラクティスはありますか?それとも、私が使っているアーキテクチャが間違っているのですか?
@Shy:場合によっては解決策ですが、コントローラの外側からX
が変更された場合(たとえば、元に戻す/やり直しのコマンドパターンを使用する場合など)には余計なイベントが発生します。が変更された場合、W
が更新され、イベントが発生します。モデルに対する別の(役に立たない)更新を防ぐために、ウィジェットによって生成されたイベントは飲み込まなければならない。
場合によっては、モデルがより複雑になり、正確に何が変更されたかを簡単にチェックすることが実現できない可能性があります。複雑なツリービュー。
MFCのリストボックスで常にこの問題が発生します。 –