5

MVVM には素晴らしい例がたくさんありますが、私はまだ混乱しています。

CustomerModel と CustomerViewModel があるとします。CustomerModel に Name プロパティがあり、CustomerViewModel に 1 つあるようです。UI が更新されるように、CustomerViewModel のセッターは CustomerModel Name プロパティを設定し、OnPropertyChanged(PropName) を呼び出します。これは本当に正しいですか?ゲッター/セッターが2回定義されるようです。50 個のプロパティを持つモデルがある場合、それは非常に面倒です。

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

4

3 に答える 3

5

ViewModelは、モデルを厳密にカプセル化する必要はありません。シナリオでは、CustomerViewModelにCustomerプロパティがある場合があります。これは、最終的に、ビューがModelプロパティにバインドされることを意味します...ViewModelを介してバインドするだけです。それは完全に合法です。とはいえ、これをカプセル化することには多くの場合利点があります。ビジネスモデルに変更通知が含まれていない場合があります。ユーザーが[OK]ボタンをクリックするまで、ユーザーの操作によってビジネスモデルを変更したくない場合があります。別の形式の検証を使用したい場合、ビジネスモデルは不正な入力の例外を通過する可能性があります。他のことも考えられると思います。実際、ほとんどの場合、カプセル化が必要になると思いますので、それほど「面倒」ではありません。

于 2009-03-19T20:47:06.620 に答える
2

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

例えば

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

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

ViewModel には、その他の UI 状態のビットも含まれます。可視性フラグ、現在のタブ インデックス、いくつかのフィールドのデータから作成されたより複雑なテキスト、子項目の ObservableCollection<> などです。すべてが XAML にバインドされます。

Model から作成された ViewModel が、コンストラクターなどを使用して、1 回限りの一方向のプロセスであることがわかりました。

  CustomerViewModel viewModel = new CustomerViewModel(customer);

または拡張メソッドとして

  CustomerViewModel viewModel = customer.ToViewModel();

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

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

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

于 2009-03-13T10:54:44.710 に答える
0

これがどのように行われるかは、 wekempfがすでに述べているように、ビジネス モデルに部分的に依存します。

UI に顧客情報を表示する方法によっては、ViewModel に顧客 (モデル) タイプの ObservableCollection がある場合があります。たとえば、マスター/詳細シナリオを表示している場合、顧客のリストがあり、特定の顧客が選択されるとその下に詳細が表示される場合があります。

于 2009-05-08T13:16:12.597 に答える