3

それは簡単な質問で、何時間もインターネットを検索しましたが、うまくいきませんでした...

1 つのプロパティを持つモデルとビュー モデルがあります。このプロパティをビューで表示可能にするために、モデル オブジェクトから自動的に生成されるビュー モデル オブジェクトを使用します。もちろん、次のコードは StackOverflowException をスローします。これは、モデル内のモデル オブジェクトを更新するとビュー モデル内のビュー モデル オブジェクトが更新され、これによりモデル内のモデル オブジェクトが更新されるためです。等々...

class ModelObject
{
  ...
}

class ViewModelObject
{
  ...
}

class Model : INotifyPropertyChanged
{
  private ModelObject modelObject = new ModelObject();

  ...

  public ModelObject ModelObject
  {
    get
    {
      return this.modelObject;
    }
    set
    {
      this.modelObject = value;
      this.NotifyPropertyChanged("ModelObject");
    }
  }
}

class ViewModel : INotifyPropertyChanged
{
  private ViewModelObject viewModelObject = new ViewModelObject();
  private Model model = new Model();

  ...

  public ViewModel()
  {
    this.model.PropertyChanged += new PropertyChangedEventHandler(this.propertyChangedEvent);
  }

  public ViewModelObject ViewModelObject
  {
    get
    {
      return this.viewModelObject;
    }
    set
    {
      this.viewModelObject = value;
      this.model.ModelObject = new ModelObject(...);
      this.NotifyPropertyChanged("ViewModelObject");
    }
  }

  private void propertyChangedEvent(object sender, PropertyChangedEventArgs e)
  {
    if (e.PropertyName.Equals("ModelObject"))
    {
      this.ViewModelObject = new ViewModelObject(...);
    }
  }
}

これら 2 つのオブジェクトを同期する一般的な方法は何ですか?

4

1 に答える 1

5

銀の弾丸はありません。モデルはデータベースの表現であり、ビューモデルはインターフェイスに近いため、モデルをビュー モデルに、またはその逆に変換するために必要なビジネス ロジックが常に存在します。

通常、ビュー モデル クラスには 2 つのメソッドがSyncModel(ViewModel viewModel)あります。SyncViewModel(Model model)

もう一つの提案 -

モデルは INotifyPropertyChanged を実装すべきではありません。ビュー モデルは、これをユーザー インターフェイスへのバインドとして実装する必要があります。モデルを変更する必要があるのはなぜですか? これは、データベース内の内容を表します。更新はできますが、なぜモデルの変更通知が必要なのですか?

編集: MVVM: モデルをサーバー バージョンと同期させながらモデルにバインドする

ハードリファレンス。別のクラスへの参照を持つ各クラスは、プロパティ変更イベントをリッスンし、それに応じて自身を更新します。

オブザーバー パターン - オブザーバー クラスを用意します。各クラスはそれ自体をオブザーバーに登録し、オブザーバーは変更をリッスンしてすべてのサブスクライバーを更新します。

便利なイベントアグリゲーターもあります。

遅延更新が必要な場合は、isDirty プロパティが必要になります。アプリケーションについてよく知っているので、Google でさらに多くの記事を探して、賢明に選択してください。

于 2013-03-28T17:11:08.787 に答える