2

ビジネスロジックをビューから正しく分離するためにMVVMを実装しようとするプロジェクトに取り組んでいます。私はこのパターンに関する多くの論文を読み、サンプル アプリケーションを見てきましたが、まだ答えのない疑問がいくつかあります。

私のモデルは、さまざまな種類Documentsのリストを含む のセットで構成されています。DocumentObjects

DocumentObjectsは計算ロジックが含まれており、相互に、および と相互作用しますDocument

次に、Views と ViewModels を用意します ( のそれぞれにDocument1 つ、 の種類ごとに 1 つDocumentObjects) 。

これを正しい MVVM パターンで実装するには、リストDocumentViewを表示するようにします (例を使用)。次に、WPF は、DataTemplate エントリを介して使用する適切なビューを選択します。DocumentObjectsItemsControl

Documentこの方法の問題は、ビューモデルではなく実際のリストであるmy に保持したいことですDocumentObjects。次に、DataTemplate を使用してオブジェクトに使用するビューを記述した場合、使用したいビューモデルを指定できません...

私の質問は、「VVM」パーツを既存のモデルオブジェクトの上に、知らずに構築するにはどうすればよいですか? もっと現実的に言えば、MVVM ガイドラインに準拠するために、このデザイン パターンをどのように変更しますか?

(私が欲しいのは、一種の「モデルファースト」のインスタンス化です。)

私の質問を提起するサンプルアプリの1つMVVMに関するReed Copseyのブログ投稿

<DataTemplate DataType="{x:Type model:FeedItem}">
    <TextBlock Text="{Binding Path=Title}" />
</DataTemplate>

モデルは、FeedItemを使用してビューで直接使用されますDataTemplateFeedItemが必要な場合はどうすればよいViewModelですか?

(私のデザインが最善でない可能性があることは承知しており、提案を受け付けています!)。

4

1 に答える 1

1

私はあなたの質問に正確には従いませんが、ビューに公開する追加のプロパティでモデルを拡張したいようです。これがビューモデルの目的です。

たとえば、次Documentのコレクションを持つモデルがあるとしますItem

public class Document
{
    public List<Item> Items { get; set; }
}

タイプにないいくつかの追加プロパティを使用して、ビュー内の各アイテムをレンダリングしたいと考えていますItemItemビューの問題であるこれらの追加のプロパティでモデルを汚染したくないので、 ItemViewModel. 次に、通常、DocumentViewModelこのコレクションを保持する を作成します。

public class DocumentViewModel
{
    public List<ItemViewModel> ItemViewModels { get; set; }
}

次に、ビューは のインスタンスにバインドされますDocumentViewModelDocumentand型との間でデータを転送する配管コードが明らかに必要DocumentViewModelです。AutoMapperなどのライブラリを使用して、これを支援できます。

もちろん、タイプに必要なすべてのプロパティが既に含まれていると判断し、Documentそれをビューに直接公開することもできます。これは DRY 原則と LoD 原則のバランスなので、それを考慮する必要があります。

ただし、最も重要なことは、MVVM を実行している場合は、MVVM フレームワークを使用する必要があるということです。これは、ビューの構成にも大いに役立ちます。たとえば、Caliburn.Microの場合、規則では、バインド先のコレクションはビュー モデルのコレクションであると想定されており、対応するビューを自動的に見つけて 2 つをバインドします。

于 2013-05-29T09:41:13.867 に答える