2009-03-13 8 views
5

MVVMの素晴らしい例がたくさんありますが、私はまだ混乱しています。Silverlight MVVMモデルとビューモデルをリンクする

CustomerModelとCustomerViewModelがあるとします。 CustomerModelにNameプロパティがあり、CustomerViewModelにNameプロパティがあるようです。 CustomerViewModelのセッターはCustomerModel Nameプロパティを設定し、UIが更新されるようにOnPropertyChanged(PropName)を呼び出します。これは本当に正しいですか? getter/setterが2回定義されるようです。あなたが50のプロパティを持つモデルを持っているなら、それは本当に退屈になるでしょう。

また、Qtyプロパティを設定するとします。 ViewModelはモデルを更新します。モデルは、新しい数量に基づいてValueプロパティを更新します。 ViewModelは、Modelプロパティが変更されたことをどのように通知しますか?

答えて

2

お客様の例では、CustomerModelには、データベース(または他のバックエンド)によって保存されているすべての情報が含まれています。 CustomerViewModelにUI(名前など、大規模なクラスがある場合は50のプロパティ)に表示される場合は同様の情報が含まれますが、INotifyPropertyChangedインターフェイスを使用してView(つまりXAML)に結合する。

すべてそこにあるなど可視性フラグ、現在のタブインデックス、いくつかのフィールドのデータから構築、テキストのより複雑なビット、のObservableCollection子項目の< >、 -

public int Name 
{ 
    get 
    { 
     return this.name; 
    } 

    set 
    { 
     if (this.name!= value) 
     { 
      this.name= value; 
      this.OnPropertyChanged("Name"); 
     } 
    } 
} 

ViewModelには、他のUIの状態のビットが含まれていますXAMLにバインドされます。

モデルから作成されたViewModelは、ワンタイム・ワンウェイ・プロセスとして見てきました。コンストラクタで:

CustomerViewModel viewModel = new CustomerViewModel(customer); 

または拡張メソッド

CustomerViewModel viewModel = customer.ToViewModel(); 

として私は、モデルへの変更のためのViewModelを更新するためのいずれかの条項を見ていない - のViewModelのポイントは、それがから分離されたということですモデル。それはデータの別のコピーを保持します。変更をモデルに反映させるのではなく、「保存」ボタンを押すまでは反映されません。したがって、代わりにキャンセルすると、モデルの何も変更されておらず、元に戻すことはありません。

モデルでViewModelを最新の状態に保つことができない場合があります。保存や読み込みのようなほとんどの場合、現在のViewModelを放棄してモデルの現在の状態から新しいモデルを作成できます。 ViewModelのUI状態を維持し、その中のデータを変更する必要がありますか?一般的な要件ではありませんが、セーブまたはロードが発生したときに呼び出される1つまたは2つのメソッドで実行できます。

したがって、このワイヤーアップロジックがどこかで発生するという前提もあります。このため、のビューを含むほとんどのパターンには、コマンドの操作(顧客の表示、顧客の保存など)とその後の新しいUI状態の設定を担当するコントローラが含まれています。

+0

ViewModelをモデルから分離しておく場合モデルのどのようなルールが適用されますか?私は数量と価値を持つモデルを持っているとします。新しいQtyに基づいて値を更新するモデルに流すViewModelの数量を変更した場合。これでViewModelに新しい値が表示されます。 –

+0

「ViewModel上の数量をモデルに流す必要があります」を「いいえ」に変更した場合は、「保存」ボタンなどを押してください。そうするとき、そのハンドラはモデルを更新し、それを保持し、新しいViewModelを新しいModel状態から外す必要があります。 – Anthony

+0

モデルに流れ込まない場合、ViewModelはどのように更新されたValueフィールドを取得しますか? Qtyを変更すると、ユーザーとして新しい値が表示されます。 MVにはValueを計算するビジネスロジックはなく、モデルのみが行います。 –

5

あなたのViewModelは厳密にモデルをカプセル化する必要はありません。あなたのシナリオでは、CustomerViewModelにはCustomerプロパティがあります。これは最終的に、ViewがModelプロパティにバインドされていることを意味します。ViewModelを使用するだけです。それは完全に合法です。しかし、これをカプセル化することはしばしば利点です。ビジネスモデルに変更通知が含まれていない可能性があります。ユーザーが「OK」ボタンをクリックするまで、ビジネス・モデルを変更する必要はありません。あなたのビジネスモデルは、別の形式の検証を使用したい間に、入力が悪いという例外を介して行われることがあります。私はあなたが他のことを考えることができると確信しています。実際、カプセル化が必要な時代だと思いますので、無意味なリレーメソッドを書くという意味では「面倒」ではありません。

0

これは正確にどのように行われているかは、wekempfが既に述べたように、ビジネスモデルによって部分的に異なります。

お客様のUIに表示される顧客情報の表示方法に応じて、ObservableCollection of Customer(ご使用のモデル)タイプをViewModelに含めることができます。たとえば、マスター/詳細シナリオを表示している場合、特定の顧客が選択されたときに顧客のリストを表示し、詳細を表示することができます。

関連する問題