ファイル転送機能も備えたチャット アプリケーションを作成しています。Prismを利用したMVVMパターンで設計しようとしています。
このアプリケーション、または少なくともこの 1 つのモジュール (アプリケーションには現時点で 1 つのモジュールしかなく、それが唯一のモジュールである可能性があります) の私のモデルは、サーバーのホスト、サーバーへの参加、およびすべての状態の保持を担当する ChatManager クラスです。チャットセッションの情報。別のサーバーに接続しているクライアントである場合もあれば、チャットをホストする個人が自分のサーバーのクライアントでもあるため、クライアントとサーバーの両方である場合もあります。
私のアプリケーションでは、プログラムのさまざまな領域 (メッセージ領域、ユーザー リストがある領域、ユーザーがメッセージを入力する領域) ごとに異なるビューとビューモデルを使用しています。ビューはビューモデルについて何も知らず、ビューモデルはビューについて何も知りません。ビューモデルは非常に単純化されており、ロジックはほとんど含まれていません。
すべてのロジックは、基本的にアプリケーションのフローを制御する ChatController クラスにあります。すべてのビューとすべてのモデルを作成し、ビューのデータコンテキストとして適切なビューモデルを割り当て、適切なタイミングで各ビューをシェルに挿入します。また、モデルからビューモデルに実際のデータを割り当てる責任もあります。
私が抱えている問題は、ビューモデル ObservableCollections をモデル内に含まれるリストで最新の状態に保つ方法です。たとえば、モデルには接続ユーザーのリストがあります。ユーザーが接続または切断したときなど、そのリストが変更されるたびに、ユーザー リストを処理するビューモデル内のユーザーの ObservableCollection を更新する必要があります。
これを達成するために私が考えている方法は、イベントを使用することです。そのため、ユーザーが接続するたびに、ユーザーが切断するたびに、モデルで発生するイベントを作成しました。サーバーがすべてのユーザーにメッセージを送信するとき、およびモデルが実際に行う他のすべてのことのために、イベントも必要です。
私の質問は、これは良い方法ですか?代わりに、モデルのユーザー コレクションを ObservableCollection に変更し、イベントを完全に回避して、viewmodel のコレクションをモデル コレクションに割り当てる必要がありますか?
このアプリケーションを構造化しようとすればするほど、ますます混乱します。現在、私のコントローラはメソッドの数が非常に多く、必要なチャット プログラムのすべての機能を追加し始めていません。