8

私はMvvmCrossフレームワークへの最初の一歩を踏み出し、プロジェクトとクラスの構造の観点から最良のアプローチを決定しようとしています。私の最大の関心事は、ビューモデル間でデータを共有し、同時にmvvmガイダンスに従うために、ビューモデルをどのように編成するかを決定することです。

ビューとそれぞれのビューモデル(メインと構成)の簡単な例があります。メインビューには、ビューモデルのプロパティにバインドされたいくつかのコントロールがあります。構成ビューを使用すると、ユーザーはテキストの色やリスト内のアイテム数などを変更できます。ユーザーが構成を変更すると、これがメインビューに反映されます。

私の最初のアプローチは、別々のビューとビューモデルを作成することでした。しかし、構成が変更されたことをメインビューに通知するにはどうすればよいですか?Github / SlodgeでSpheroプロジェクトを見て、ビューモデルが他のビューを直接参照していることに気付きました。このように、構成が変更されるたびにメインビューに通知するのはかなり簡単です。しかし、これはmvvmが推奨する分離されたビューモデルの逸脱ではありませんか?

このタイプのクラス構造化にアプローチするための最良の方法について、いくつかの洞察を得ることができますか?

4

2 に答える 2

7

このタイプのクラス構造化にアプローチするための最良の方法

私の意見では、「最善の方法」の最も重要な手段は、アプリが機能することを意味する方法を選択することです。


あなたが見た例(スフェロボールコントロール)には、独立したビューモデル(ホーム、江南、アバウト、スフェロなど)の両方の例があり、お互いを知っているいくつかのビューモデルの例(スフェロビューモデル)がありますそしてそれはサブビューモデルです。

この特定のケースでは、これらのビューモデルがすべてお互いを知っている理由は、それらがすべて単一のディスプレイの一部であるためです。これらは、単一のグリッド、ピボット、またはタブ付きUI内に一緒に配置されるように設計されています。彼らの協力を支援するために、私はIParentおよびIChildインターフェースを介してそれらに相互参照を与えました。

これは、mvvmが推奨する分離されたビューモデルの逸脱ではありませんか?

これは、デザインが完全に分離されていないことを意味し、将来、それらの子vmを移動または再利用する必要がある場合は、コードのリファクタリングを少し行う必要があるかもしれませんが、今のところ、デザインはうまく機能しています、そして私は個人的に、必要に応じて将来そのリファクタリングを行うことができてうれしいです。


今の私の最大の関心事は、ビューモデル間でデータを共有し、同時にmvvmガイダンスに従うために、ビューモデルをどのように編成する必要があるかを決定することです。

複合(タブ付き)ビューを構築していて、集約されたビューモデル(sphero vmやそのサブビューなど)を使用することに満足できない場合は、使用しないでください。

1つの大きなビューモデルを使用するか、メッセンジャーを介して通信する複数のビューモデルを使用するか、1つ以上のカスタムサービスを介して通信する複数のビューモデルを使用することで、同じ効果がspheroで達成された可能性があります。

構成とメインビューの特定の例では、これはタブ付きのシナリオには当てはまらないと思います。おそらくメッセンジャーを使用してこれをコーディングします。これにより、変更通知をブロードキャストおよび受信するための柔軟なメカニズムが提供されます。アプリのさまざまな部分。

ただし、他のデザインは間違いなく利用可能で実行可能です。たとえば、表示されるたびにビューモデルに構成を更新するように簡単に依頼できます(これを行うには、onnavigatedto、viewwillapear、およびビューの再開呼び出しにフックする必要があります)。


要約すれば:

  • 独立したビューモデルを作成し、サービスを介して通信させるというあなたの一般的な目標に同意します。
  • メインページと設定ページの場合、おそらく2つの別々のVMとメッセンジャーを使用します
  • タブ付き/ピボットUIの場合、私は個人的にその完璧なパラダイムから脱却しました-しかし、mvxにはあなたが私に従うことを強制するものは何もありません
于 2013-01-14T08:58:23.457 に答える
2

MvvmCrossを使用して構築しているプロジェクトでは、ビュー(画面)とその状態を表すためにビューモデルを使用することにしました。私のビューモデルは、ISQLiteConnectionFactoryを使用してSQLiteデータベースに接続されています。SQLiteデータベースに保存されているモデルを使用して、プロジェクト内の状態を表します。私のビューモデルはSQLiteデータベースからモデルを取得し、それらを分析して反応します。

例。ユーザーがデバイスにデータをダウンロードしたいというフラグを立てることができる画面があります。私のモデルには、そのデータをダウンロードする必要があるのか​​、ダウンロードしたのかというフラグがあります。データのダウンロードを担当する別の画面を開くと、SQLiteを調べて、ダウンロード用にマークされているモデルがないか調べ、それに反応します。

このようにして、ビューモデル間でデータを共有することにしました。利点は、データが常にデータベースに保持されることです。アプリを強制的に閉じても、データが失われることはありません(または予期したとおりに何かが発生することはありません)。

于 2013-01-15T14:03:10.230 に答える