1

John Papa によるBookShelfデモ アプリケーションをいじっています。また、書籍アイテムの編集方法を調整したいと考えています。そのアプリケーションでは、BookView と EditBookWindow の両方が同じ ViewModel BookViewModel にバインドされていますが、これは問題ありません。

ブックを選択すると、EditBookWindow が子ウィンドウで開かれます。

private void OnLaunchEditBook(LaunchEditBookMessage msg)
{
    var editBook = new EditBookWindow();
    editBook.Show();
}

いずれかの値を編集すると、選択した本のデータが BookViewModel で更新されます。ここで問題が発生します。ダイアログ ウィンドウで [キャンセル] を押しても、変更は保持されます。

private void OKButton_Click(object sender, RoutedEventArgs e)
{
    this.DialogResult = true;
}

private void CancelButton_Click(object sender, RoutedEventArgs e)
{
    this.DialogResult = false;
}

私がやりたいことは、ダイアログウィンドウを開いて編集を開始する前に、エンティティをその状態に「ロールバック」するように変更することです。

この問題に関する私の Google 検索では、これを解決する最も効率的な (そして簡単な) 方法は、IEditableObject インターフェイス (BeginEdit、EndEdit、または CancelEdit) を使用することだと思います。

このインターフェイスを実装する方法がわかりません。EditBookWindow と BookView の両方が同じ ViewModel を共有しているため、変更された項目はプロパティ SelectedBook に格納されます。

private Book _selectedBook;
public Book SelectedBook
{
    get { return _selectedBook; }
    set
    {
        _selectedBook = value;
        RaisePropertyChanged("SelectedBook");
    }
}
  1. IEditableObject は私の問題に対する最も簡単なアプローチですか?
  2. Can anyone give some pointers on where (ViewModel, Views) and how I could implement the interface?
4

1 に答える 1

2

これは、この投稿で取り上げられている問題と同じであり、同じ解決策を適用できます。:-)

つまり、モデルのコピーを作成し、それで詳細ビューを初期化します。または、ビューモデル内にモデルのコピーを保持し、キャンセルが押されたときにリセットします。または、キャンセル時にデータ ソースからアイテムを再読み込みします。

編集

を使用したい場合はIEditableObject、 でモデルを保存しBeginEdit、 で保存された状態をクリアし、保存された状態EndEditを使用して で元の状態を復元できCancelEditます。r を使用すると、JavaScriptSerializeバックアップ コピーの作成が非常に簡単になります。

使用IEditableObjectは単なるバリエーションであり、まったく異なる概念ではありません。モデルを使用IEditableObjectすると、それ自体がロールバック メカニズムの処理を担当します。最初のアプローチでViewModelは、責任があります。

Model使用して編集できる場合IEditableObjectは問題ありませんが、Web サービスにアクセスするときにモデルがプロキシによって生成される場合など、モデルを変更できないことがよくあります。

于 2011-06-28T22:29:48.237 に答える