私はジョン・パパによって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");
}
}
- はIEditableObjectは私の問題への最も簡単なアプローチですか?
- 誰でもどこで(ViewModel、Views)のどこにポインタを渡すことができますか、どのようにインターフェイスを実装できますか?
1つのアプローチは、書籍のバージョンをBookViewModelのプロパティとしてキャッシュすることです。 MVVM-lightメッセージングを使用すると、「キャンセル」が押された後、selectedBook = _cachedBookを設定すると、BookViewModelにメッセージを送り返すことができますか?それとももっと一般的なアプローチをとるべきでしょうか? – Kman