我正在玩John Papa的BookShelf演示应用程序。
并希望对书籍项目的编辑方式进行一些调整。在该应用程序中,BookView和EditBookWindow都绑定(bind)到相同的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;
}

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

我在这个问题上的google搜索使我认为解决此问题的最有效(最简单)的方法是使用IEditableObject接口(interface):BeginEdit,EndEdit或CancelEdit。

我在弄清楚如何实现此接口(interface)时遇到了麻烦。由于EditBookWindow和BookView共享同一个ViewModel,因此更改的项目将存储在属性SelectedBook中
private Book _selectedBook;
public Book SelectedBook
{
    get { return _selectedBook; }
    set
    {
        _selectedBook = value;
        RaisePropertyChanged("SelectedBook");
    }
}
  • IEditableObject是解决我的问题的最简单方法吗?
  • 谁能提供一些有关哪里(ViewModel,Views)以及如何实现该接口(interface)的指针?
  • 最佳答案

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

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

    编辑:

    如果要使用IEditableObject,则可以将模型保存在BeginEdit上,清除EndEdit上的保存状态,然后使用保存的状态来还原CancelEdit上的原始状态。 JavaScriptSerialize r的使用使创建备份副本变得非常容易。

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

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

    关于mvvm - Silverlight MVVM IEditableObject对话框,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6512356/

    10-10 23:09