2011-06-28 102 views
1

我玩弄約翰爸爸的BookShelf演示應用程序。 並且想要對書籍項目的編輯方式進行一些調整。在該應用程序中,BookView和EditBookWindow綁定到相同的ViewModel BookViewModel,這很好。Silverlight的MVVM IEditableObject對話框

選擇一本書,將導致EditBookWindow在一個childwindow

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; 
} 

我想要做的就是在打開dialogwindow並開始編輯之前,將此實體更改爲「回滾」實體。

我在這個問題上谷歌搜索使我認爲,解決這個的最有效的(易)的方式是通過IEditableObject接口:BeginEdit,EndEdit中或的CancelEdit。

我無法搞清楚如何實現這個接口。同時作爲EditBookWindow和圖書查看正在共享同一個視圖模型,該項目改變的是存儲在屬性SelectedBook

private Book _selectedBook; 
public Book SelectedBook 
{ 
    get { return _selectedBook; } 
    set 
    { 
     _selectedBook = value; 
     RaisePropertyChanged("SelectedBook"); 
    } 
} 
  1. 是在IEditableObject最簡單的方法我的問題?
  2. 任何人都可以給一些指針(ViewModel,Views)和我如何實現接口?
+0

一種方法可能是將本書的一個版本作爲BookViewModel中的一個屬性進行緩存。如果按下'cancel',然後設置selectedBook = _cachedBook?使用MVVM-light消息傳遞,我可以將消息發回給BookViewModel。或者我應該去尋求更通用的方法? – Kman

回答

2

這是this post提出的同樣的問題,可以應用相同的解決方案。 :-)

總之創建模型的副本,它初始化您的詳細視圖。或者在您的視圖模型中保存模型的副本,並在按下取消按鈕時將其復位。或取消時從數據源重新加載項目。

編輯

如果你想使用IEditableObject可以節省BeginEdit模型,清除EndEdit保存的狀態,並使用保存的狀態恢復上CancelEdit原來的狀態。 JavaScriptSerializer的使用使得創建備份副本變得非常簡單。

使用IEditableObject只是一個變化,但不是完全不同的概念。使用IEditableObject它自己負責處理回滾機制的模型。在第一種方法中,ViewModel負責。

如果您可以使用IEditableObject來編輯Model沒有問題,但通常您無法修改模型,例如,如果您的模型是在訪問Web服務時由代理生成的。

+0

但是這個解決方案不會使用IEditableObject,如果我正確的話這將是解決這個問題的最好方法。我想我會多看一些IEditableObject,看看我能否掌握如何實現它。如果沒有,那麼我會去鏈接後的解決方案 – Kman

+0

@Kman:請參閱編輯。 – AxelEckenberger