ViewModelは、プロパティとしてXAML要素を公開する必要がありますか?
-
06-07-2019 - |
質問
StackOverflowの質問の終わり WPFコンバーターをMVVMパターンで使用するにはどうすればよいですか バリューコンバーターの機能はによって処理される必要があるため、MVVMパターンではバリューコンバーターを使用しないでくださいViewModel自体。
これは理にかなっています。
しかし、 XAML要素をビューに公開しないことを読んだことを覚えていますが、代わりに、ViewがDataTemplatesを使用してバインドおよび表示するデータのコレクションのみを公開します。
ただし、コンバーターは非常に強力なようです(たとえば、 MVVMテンプレートデモ、<!> quot;メッセンジャーサンプル<!> quot;開梱後)を参照してください。オブジェクトをオブジェクトに変換できます。例: FlowDocumentオブジェクトへのメッセージオブジェクト、VisibilityオブジェクトへのCustomerオブジェクト、Imagesへのカスタムステータスオブジェクトなど。
したがって、ViewModelが Value Converterの機能を使用する場合、StackPanel、Visibility、Color、FlowDocumentなどのXAML要素とプロパティを公開する必要があります。右?
ViewModelがこれらのリッチXAMLオブジェクトをValue Converterのように公開しない理由を誰かが見ていますか?
解決
そのため、特定の視覚的表現でのみ使用されるようにViewModelが制限されます。 XAMLを出力するViewModelを取得すると、設計コンテンツを開発者のドメインに配置します。 これは、Expression Blendを使用するデザイナーがデザインアセットを編集できないことを意味し、デザイナー/開発者のワークフローが壊れています。 ページにXAMLを保持し、データテンプレートで値コンバーターを使用すると、デザインがコードから分離されます。
ViewModelが特定のXAMLを公開すると、ViewModelがその特定のインスタンスでのみ使用されるように制限され、再利用性が低下します。
他のヒント
DataTemplatesも使用できることを忘れないでください。 ValueConvertersをMVVMから遠ざけることにはある程度の意味がありますが、DataTemplatesはオブジェクトをGUIに変換することについてすべてです。
ViewModelは他のオブジェクト(ネストされたViewModelなど)をGUIに公開でき、GUIは<DataTemplate DataType="{x:Type SubViewModel}">...
を使用してそれらのオブジェクトをGUIにマッピングできます。
ViewModelがこれらのリッチXAMLオブジェクトをValue Convertersのように公開してはならない理由は誰にもわかりますか?
絶対に、それはMVVMのすべての目標を損なうためです:
- 少なくとも簡単にではなく、ユニットテストができなくなりました。
- ロジック(ビューモデル)とプレゼンテーション(ビュー)が分離されなくなりました。したがって、デザイナーと開発者は簡単に共同作業できません。
- 懸念事項が混在しているため、コードのメンテナンスはより困難です。
ビューを返すビューモデルを見た場合、それをMVVMとして分類することさえしません。
mvvm / mvc / mvpなどのアイデアの1つは、GUIコードを1つのファイル/クラスに分離することだと思います。 これを行うと、他のオブジェクトを書き換えずに他のUIに変更できますか? WPF固有のオブジェクトを渡す場合、答えはノーだと思います。 それはあなた自身のために作らなければならない価値判断です。
コミュニティの心がこの方向にあるように変化した理由の観点なしにそれらを議論するとき、この概念または他の多くの概念に働く絶対的な100%ルールはありません。 「従来の知恵」には、当時の新しさや説得力に関係なく、「想定された」真実や科学はありません。
言い換えれば、あなたのチームが最善を尽くすだけで、あなたはすでにこれほどリアルなものよりも人間の関心事ではるかに引き下げられているようになります。