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

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

我在这个问题上的谷歌搜索让我认为解决这个问题的最有效(和简单)的方法是使用 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)以及我如何实现接口给出一些指示?
4

1 回答 1

2

这与这篇文章所解决的问题相同,并且可以应用相同的解决方案。:-)

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

编辑

如果要使用IEditableObject可以将模型保存为on BeginEdit,清除保存状态为on EndEdit,使用保存状态恢复为on CancelEdit。r的使用JavaScriptSerialize使得创建备份副本变得非常容易。

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

如果您可以编辑Model使用IEditableObject就可以了,但通常您无法修改模型,例如,如果您的模型是在访问 Web 服务时由代理生成的。

于 2011-06-28T22:29:48.237 回答