Silverlight MVVM IEditableObject对话框

时间:2011-06-28 19:55:50

标签: mvvm dialog mvvm-light ieditableobject

我正在玩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;
}

我想要做的是在打开对话框窗口并开始编辑之前将其更改为“将实体”回滚到其状态。

我在这个问题上的谷歌搜索让我认为解决这个问题最有效(也很容易)的方法是使用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. 任何人都可以提供一些指示(ViewModel,Views)以及如何实现界面吗?

1 个答案:

答案 0 :(得分:2)

这与this post所解决的问题相同,可以应用相同的解决方案。 :-)

简而言之,创建模型的副本,使用它初始化您的详细信息视图。或者,在视图模型中保留模型的副本,并在按下取消时重置模型。或者在取消时从数据源重新加载项目。

修改

如果您想使用IEditableObject,可以将模型保存在BeginEdit上,清除EndEdit上的已保存状态,并使用已保存状态恢复{{1}上的原始状态}}。使用CancelEdit r可以非常轻松地创建备份副本。

使用JavaScriptSerialize只是一种变体,但并非完全不同的概念。使用IEditableObject模型,它自己负责处理回滚机制。在第一种方法中,IEditableObject负责。

如果您可以使用ViewModel修改Model,那么您通常无法修改模型,例如如果您在访问Web服务时由代理生成模型。