【问题标题】:Silverlight MVVM IEditableObject DialogSilverlight MVVM IEditableObject 对话框
【发布时间】:2011-06-28 19:55:50
【问题描述】:

我正在玩 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)以及如何实现接口的指针?

【问题讨论】:

  • 一种方法是将图书的版本缓存为 BookViewModel 中的属性。使用 MVVM-light 消息传递,如果按下“取消”,我可以将消息发送回 BookViewModel,然后设置 selectedBook = _cachedBook ??还是我应该采用更通用的方法?

标签: mvvm dialog mvvm-light ieditableobject


【解决方案1】:

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

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

编辑

如果要使用IEditableObject,可以将模型保存到BeginEdit,清除EndEdit上的保存状态,并使用保存状态恢复CancelEdit上的原始状态。 JavaScriptSerializer 的使用使得创建备份副本变得非常容易。

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

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

【讨论】:

  • 但是这个解决方案不会使用 IEditableObject,如果我是正确的,这将是解决这个问题的最佳方法。我想我会更多地研究 IEditableObject,看看我是否能掌握如何实现它的窍门。如果没有,那么我将采用链接帖子中显示的解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-28
  • 1970-01-01
  • 2010-12-12
  • 2011-04-15
  • 1970-01-01
  • 2012-06-08
  • 1970-01-01
相关资源
最近更新 更多