2016-04-29 6 views
0

私はWPFでMVVMの検索に長時間を費やしてきました。私はなぜそれを使用するのか理解しています。これは私にとっては明らかです。 私は、ViewModel自体に何がないのですか?私はそれがビューとモデルの間の接続であることを知っています。また、INotifyPropertyChangedを実装している(少なくとも、ほとんどのプログラマーが示唆しているように)私は知っています。これにコマンドを追加する。MVVMのViewModelにあるもの

は、私は、このモデル(EF 6とコードファーストを)持っていることを、言ってみましょう:

public class City 
{ 
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int CityId { get; set; } 

    [DataType("VarChar"), MaxLength(25), Required] 
    public string CityName { get; set; } 
} 

私の質問は以下のとおりです。私が見てきた多くの例で

1-、彼らは同じフィールドを再作成します再びVMで。目的は何ですか、オブジェクト全体を持つだけで十分ですか(私の例ではCity)。どのように多くのフィールドがあるのはいかがですか。

2自分のビュー(CRUD)で使用できるようにするために、CityVm()はどのように私の例になりますか?

何か助けていただきありがとうございます。

+0

この答えで編集した後、一部を読む:http://stackoverflow.com/a/6421602/109702 – slugster

答えて

3

MVVMパターンのビューモデルは、ビューのプレゼンテーションロジックとデータをカプセル化します。ビューへの直接の参照や、ビューの具体的な実装やタイプに関する知識はありません。ビューモデルは、ビューがデータをバインドできるプロパティとコマンドを実装し、変更通知イベントを介して状態の変更をビューに通知します。ビューモデルが提供するプロパティとコマンドは、UIによって提供される機能を定義しますが、ビューはその機能をレンダリングする方法を決定します。

ビューモデルは、必要なモデルクラスとビューの相互作用を調整する役割を担います。通常、ビュー・モデルとモデル・クラスとの間には1対多の関係があります。ビューモデルは、モデルクラスをビューに直接公開して、ビュー内のコントロールがデータに直接バインドできるようにすることができます。この場合、モデルクラスはデータバインディングと関連する変更通知イベントをサポートするように設計する必要があります。

ビューモデルは、モデルデータを変換または操作して、ビューで簡単に使用できるようにすることがあります。ビューモデルは、ビューを具体的にサポートする追加のプロパティを定義することができる。これらのプロパティは、通常、モデルの一部ではない(または追加することはできません)。例えば、ビューモデルは、ビューを提示しやすくするために2つのフィールドの値を組み合わせることができ、または最大長のフィールドの入力のために残っている文字の数を計算することができる。ビューモデルは、データの整合性を保証するためのデータ検証ロジックを実装することもできます。

ビューモデルは、ビューがUIで視覚的な変更を提供するために使用できる論理状態を定義することもできます。ビューは、ビューモデルの状態を反映するレイアウトまたはスタイリングの変更を定義することができる。例えば、ビューモデルは、データがウェブサービスに非同期的に提出されていることを示す状態を定義することができる。ビューは、この状態の間にアニメーションを表示して、ユーザに視覚的なフィードバックを提供することができる。

一般的に、ビューモデルは、UIで表現でき、ユーザーが呼び出すことができるコマンドまたはアクションを定義します。一般的な例は、ビューモデルがユーザーがWebサービスまたはデータリポジトリにデータを送信できるようにするSubmitコマンドを提供する場合です。ビューは、ユーザーがボタンをクリックしてデータを送信できるように、ボタンでそのコマンドを表すことを選択することができます。通常、コマンドが使用できなくなると、関連するUI表現が無効になります。コマンドは、ユーザーのアクションをカプセル化し、UIのビジュアル表現から完全に分離する方法を提供します。要約する

、ビューモデルは、次の主要な特徴を有する:

  • ビューモデルは、非ビジュアルクラスであり、任意のWPF基本クラスから派生しません。アプリケーション内のユースケースまたはユーザータスクをサポートするために必要なプレゼンテーションロジックをカプセル化します。ビューモデルは、ビューとモデルとは独立してテスト可能です。
  • ビューモデルは通常、ビューを直接参照しません。これは、ビューがデータをバインドできるプロパティとコマンドを実装します。 INotifyPropertyChangedおよびINotifyCollectionChangedインターフェイスを介して、変更通知イベントを介して状態変更のビューを通知します。
  • ビューモデルは、ビューとモデルとの対話を調整します。ビューで簡単に使用できるようにデータを変換または操作し、モデルに存在しない追加のプロパティを実装することがあります。また、IDataErrorInfoまたはINotifyDataErrorInfoインターフェイスを介してデータ検証を実装することもできます。
  • ビューモデルは、ビューがユーザーに視覚的に表すことができる論理状態を定義することができます。
0

1-多くの例では、同じフィールドを VMに再作成しています。目的は何ですか、オブジェクト全体を持っていれば十分です(私の例では都市 )。どのように多くのフィールドがあるのはいかがですか。 ビューモデルは、ビューのロジックを実装するための責任があり、それがモデルに対してアクションを実行するので

、そこにいくつかのプロパティは必ずしもモデルの一部ではないであろういくつかのケースだが、彼らはただですビューの要件を満たすためにそこにある。

たとえば、モデルにNameSurnameがあり、ビューに両方のプロパティの連結を表示するとします。あなたはこのバインディング式を使用したり、ビューモデルにプロパティを実装する実装することができる場合があります私のビュー(CRUD)でそれを使用するために、

public string FullName => $"{Model.Name} {Model.Surname}"; 

2-できるようにするには、どのようにCityVmです() は私の例ですか?

この質問に特定の回答はありません。しかし、少なくともCityを保存するにはModelプロパティが必要です。

1

これは非常に幅広い話題に基づいています。 MVVMモデルは、ストーン・セットのものではなく、さまざまな実装方法があります。

1)ビューにモデルを公開する:

ViewModelには、私の意見では、2つの主な目的を持っています。これには2通りの方法があります。モデルでCRUDオブジェクトをラップし、NotifyPropertyChangeを管理します。この場合、ViewModelはModelをViewに公開するだけでよく、Viewに直接バインドするViewバインディングや、単純なパススループロパティを使用することはあまりありません。

他の一般的なシナリオは、あなたのモデルをCRUDとして持つことです。この場合、ViewModelはNotifyPropertyChange通知を管理し、モデルの更新などを管理します。

2)Presentationロジックとデータを管理します。モデルには配置されず、バインドして保存する必要があることがたくさんあります。モデルはデータです。データベースからロードされる可能性が最も高いです。しかし、ビューは他のプロパティを追跡する必要があります。例:あなたの都市オブジェクトがリストに表示され、ボタンでそれを表示または非表示にしたいとします。ビューを隠すためのロジックと、それが隠されているブール値はViewに属しておらず、Modelのベースデータとは関係がないため、ViewModelに座っています。

同様に、おそらくCityPopulationというプロパティがあります。あなたの見解では、1,000,000人以上の人口が赤い都市を強調したいと考えています。あなたのビューモデルは、プロパティを持っています

bool LargeCity 
{ 
    return CityPopulation<1000000; 
} 

そして、あなたはスタイルのトリガーとラベルをレンダリングします。

もう1つの例では、バインドするBrushプロパティを含むViewModelですが、おそらく一般的なのはだが悪い習慣と思われます。 slugsterはまた、ViewModelに視覚的要素が存在してはならないとコメントしています。

Brush HighlightBrush 
{ 
    get 
    { 
     if (CityPopulation<1000000) 
     { 
      return Brushes.Red; 
     } 
     else 
     { 
      return Brushes.Black; 
     } 
} 
+0

Aブラシは、視覚的な要素です。あなたのビューモデルにブラシをかけないでください。値を提示するのはVMの仕事であり、Viewはその値に従って変換(またはレンダリング)します。したがって、この例では、フラグ 'IsCityGreaterThanMillion'を持つと、そのプロパティからの真偽値に適したブラシを使用してビューがレンダリングされます。 – slugster

+0

私はそれが彼の例の一種だと思う。何か具体的な提案はありません... –

+0

@FrerkMorrinこれは悪い例であり、新しい人を混乱させる可能性があります。答えは、VMに視覚的なものを入れないように言って時間を費やしています。そして、この答えで彼は行く、そしてやっています。このようなアプローチは、MVVMの原則に反するものであり、常に大量のコード。 – slugster

関連する問題