2011-06-28 14 views
1

私はジョン・パパによってBookShelfデモアプリケーションで遊んでいます。 書籍の編集方法を調整したいと考えています。このアプリケーションでは、BookViewとEditBookWindowの両方が、同じViewModel BookViewModelにバインドされています。本を選ぶSilverlightのMVVM IEditableObjectダイアログ

は、あなたが選択した書籍のデータはBookViewModelに更新される値のいずれかを編集する場合EditBookWindowがchildwindow

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

で開くことになります。ここで問題が発生します。ダイアログウィンドウで[キャンセル]を押すと、変更はそのまま残ります。

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

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

は、私は何をしたいのは、あなたがダイアログウィンドウを開き、編集を開始する前に、それへのエンティティが状態だ「ロールバック」に変更することです。

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

このインターフェイスの実装方法を理解できません。 EditBookWindowとBookViewの両方が同じのViewModelを共有していると、アイテムが変更されたプロパティに格納されてSelectedBook

private Book _selectedBook; 
public Book SelectedBook 
{ 
    get { return _selectedBook; } 
    set 
    { 
     _selectedBook = value; 
     RaisePropertyChanged("SelectedBook"); 
    } 
} 
  1. はIEditableObjectは私の問題への最も簡単なアプローチですか?
  2. 誰でもどこで(ViewModel、Views)のどこにポインタを渡すことができますか、どのようにインターフェイスを実装できますか?
+0

1つのアプローチは、書籍のバージョンをBookViewModelのプロパティとしてキャッシュすることです。 MVVM-lightメッセージングを使用すると、「キャンセル」が押された後、selectedBook = _cachedBookを設定すると、BookViewModelにメッセージを送り返すことができますか?それとももっと一般的なアプローチをとるべきでしょうか? – Kman

答えて

2

これは同じ問題がthis postであり、同じ解決策を適用できます。 :-)

要するに、あなたのモデルのコピーを作成し、それを使用して、詳細ビューを初期化します。または、モデルのコピーをビューモデル内に保持し、キャンセルを押したときにモデルをリセットします。または、取り消し時にデータソースから項目をリロードします。

編集

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

だけ変動はなく、完全に異なる概念です。 IEditableObjectを使用すると、ロールバックメカニズムを処理するのは自己責任です。最初のアプローチではViewModelが責任を負います。

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

+0

しかし、この解決策はIEditableObjectを使用しません。私が正しいとすれば、この問題を解決する最善の方法でしょう。 IEditableObjectをもう少し見て、実装する方法が分かるかどうかを見ていきたいと思います。そうでなければ、リンク先のポストに表示されている解決策に向かいます。 – Kman

+0

@Kman:編集を参照してください。 – AxelEckenberger

関連する問題