【发布时间】: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");
}
}
- IEditableObject 是解决我的问题的最简单方法吗?
- 谁能提供一些关于在哪里(ViewModel、Views)以及如何实现接口的指针?
【问题讨论】:
-
一种方法是将图书的版本缓存为 BookViewModel 中的属性。使用 MVVM-light 消息传递,如果按下“取消”,我可以将消息发送回 BookViewModel,然后设置 selectedBook = _cachedBook ??还是我应该采用更通用的方法?
标签: mvvm dialog mvvm-light ieditableobject