1

Prism と Silverlight で MVVM を使用しています。1 つのモデルに対して複数の異なるビューがあります。私がより多くのビューを書いているので、それらのビューモデルは、この 1 つのモデルの処理に関連する多くの一般的なコードを複製しているようです。すべての VM で同じ共通コードを繰り返すのではなく、それをモデルに押し戻したいと思っています (これは、懸念事項があまりにも複雑になる可能性があります)。それとも、いくつかの一般的な ViewModel 基本クラスに入れますか? それとも、VM とモデルの間に第 2 レベルの「共有 VM」が必要なのでしょうか? この単一の共有インスタンスである第 2 レベルの VM は、複数の通常の VM によって共有される動作と状態を統合します。

これらの問題と可能なアプローチについて何かコメントはありますか?


コメントありがとうございます。問題となっている特定の「共有」VM コードについて、もっと詳しく説明するべきだったでしょう。

VM 基本クラスに将来のコードを配置することはわかりますが、が見ている特定の「共有」コードは、モデル自体によって実装された INotifyPropertyChanged に属しているようです。これは、この別のスレッドに部分的に基づいています。

モデルは本質的に動的であるため、これが SoC に違反しているとは思いません。そのプロパティの一部は、特定の時間にのみ有効です。モデルのその動的な性質は、UI にとって重要なだけでなく、適切な単体テストでも考慮されます。したがって、このモデルには INotifyPropertyChanged が必要なようです。

それについて何かコメントはありますか?

4

4 に答える 4

1

共通コードをすべてのViewModel で共有できる場合は、それを基本の ViewModel タイプに入れる価値があります。

共通コードが、特定のモデルと対話する ViewModel によってのみ共有される場合は、「共有」ViewModel が適しています。

于 2009-11-15T23:18:27.800 に答える
0

さまざまな MVVM フレームワークのほとんどの "基本 ViewModel" クラスには、INotifyPropertyChanged のサポートと、通常は UI スレッドにディスパッチするための何らかのサポートが含まれている傾向があります。

それを超えて、基本クラスにあるはずの機能を共有するViewModelが多数ある場合、このパターンを使用すればするほど、ViewModelのかなり浅い階層、すべてに共通のコードの基本ViewModelを使用していることに気付くと思いますビュー モデルと、通常はその下の別の基本クラスで、UI のその領域の共通機能を提供します。通常、一般的なコマンドまたは UI が要素を共有している場所。

ViewModelBase -> ProductsViewModelBase -> NewProductViewModel

于 2009-11-16T21:27:24.913 に答える
0

完全に MVVM であるSoapBox Coreでは、IViewModel インターフェイスと、Nigel が言ったように INotifyPropertyChanged を実装するだけの AbstractViewModel 基本クラスを定義しました。(SoapBox Core は Silverlight ではなく WPF であることに注意してください。ただし、この場合は大した問題ではありません。同様の Silverlight の作業もいくつか行いました。)

次に、IViewModel から継承するインターフェイス (IMenuItem など) をさらに定義し、それらのインターフェイスの基本的な実装を提供する抽象クラスをさらに定義しました。

これで ViewModel ツリー全体が表示されますが、おっしゃる通り、Model ツリーもあります。私はほぼ 1 年間 MVVM を使用してきましたが、ここに私の大きなひらめきがあります: モデルを作成しないでください。アプリケーションをゼロから構築する場合は、すべてを ViewModel に配置するだけです。そうしないと、大量のコードを複製することになります。

私がモデルを持っていることに煩わされたのは、INotifyPropertyChanged を実装していないため、簡単にバインドできないサードパーティのライブラリを使用していたときだけでした。エンティティ フレームワーク用の自動生成コードもここに該当する可能性があると思いますが、一部のエンティティ フレームワークでは、エンティティ自体に INotifyPropertyChanged を実装するオプションが提供されていることに気付きました。

真剣に、それを ViewModel パターンに名前を変更して、それで完了する必要があります。:)

于 2009-11-17T05:04:12.913 に答える