9

モデルがそのエンティティをViewに公開してはならず、必要なすべてのプロパティをViewModelに複製する必要があるというガイダンスがあるようです。

例:

Product
Id {get; set;}
Name {get; set;}
.......


ProductViewModel : ViewModelBase
Id {get; set;}
Name {get; set;}
.......

なぜこれが必要なのですか?ModelがINPCを実装していなければ理解できますが、実装していれば、これはまったく不要だと思います。

4

4 に答える 4

8

ビューがモデルにバインドされている場合:

  • ビューを変更する必要がある場合、または複数のビューがある場合、モデルを変更すると、そのモデルにバインドされているすべてのビューが変更されます。

  • ビューの観点からは、ビューがバインドされているオブジェクトはそれほど直感的ではない可能性があります。プロパティやコマンドをオブジェクトに追加する必要がある場合、それらをViewModelに追加して、モデルに「元の」プロパティを保持しますか、それともモデルを変更しますか?

ViewModelを使用すると、単一のモデルと複数の(バージョンの)ビューの間で追加の抽象化が可能になります

全体として、これは単なるガイドラインですが、アプリケーションを変更/更新する必要がある場合、今日は問題ないと思われることがそれほど大きくない可能性があることに注意してください。

于 2012-07-03T06:20:26.913 に答える
5

ガイダンスはそれだけです。手元の状況によります。純粋主義者は、モデルをビューから完全に分離することで、ビューを変更せずにモデルを変更できると主張します。

必要な場合にのみ、モデルのプロパティをプロキシする傾向があります(INPC、またはモデルにFirstNameとLastNameがあり、FullNameがないようなビュー固有のロジック)

それ以外の場合は、モデル(ViewModelのパブリックプロパティ)にバインドします。状況が変化し、何かをカプセル化する必要がある場合は、必要に応じてリファクタリングします。

私は常にViewModelが配置されていることを確認しようとします(モデルを公開するだけの場合でも)ので、後でリファクタリングが簡単になります。

于 2012-06-29T14:43:34.437 に答える
2

私の質問は、なぜあなたのモデルはINPCを実装しているのですか?彼らはする必要がありますか?

通常、モデルは単なるDTOであり、変更ロジックは必要ありません。

また、INPCの基本実装がMVVMフレームワークからのものであるが、モデルが共有アセンブリに存在する場合、そのアセンブリはMVVMフレームワーク、および場合によっては他のWPFアセンブリへの参照も必要ですか?

私たちが持っていたシナリオは、サーバー側とクライアント側の両方でデータを表す共有オブジェクトのセットでした。クライアント側はWPFアプリだったので問題ありませんでしたが、サーバー側はサービスだったので、INPCは必要ありませんでした。

于 2012-07-02T05:35:47.863 に答える
0

ViewModelが正しくありません。すでに製品タイプのモデルがある場合は、ViewModelで次のように定義するだけです。publicProduct Product {...}

于 2013-10-04T07:16:56.877 に答える