取消编辑对话框时,在数据上下文中恢复原始值

时间:2015-08-06 21:39:51

标签: c# wpf xaml mvvm data-binding

在我的网格中,点击一下,我将整行的项目提供给另一个窗口(模态对话框),并将其作为数据上下文。当用户完成后,只有在对话框的结果为真时才会对DB进行更新。

private void DataGridRow_OnClick(Object sender, MouseButtonEventArgs eventArgs)
{
  Editor dialog = new Editor((sender as DataGridRow).Item as Thing);

  if (dialog.DialogResult ?? false)
    (DataContext as ViewModel).Update();
}

这就像魅力一样,只有在用户点击接受按钮时才会更新数据库。但是,它也有一定的意外行为。编辑器窗口中所做的更改虽然被取消(将 DialogResult 的值设为 false ,因此省略了DB的更新),但仍然在网格中可见

一旦人们想到这一点就很明显了,因为我们在将editee对象提供给模态窗口的构造函数时绑定到一个对象(通过引用调用)。但它几乎不能满足用户的期望。

如果没有执行对DB的更新,我打算在变通方法中编写代码,创建最初发送的对象的副本,然后恢复它。

private void DataGridRow_OnClick(Object sender, MouseButtonEventArgs eventArgs)
{
  Thing thing = (sender as DataGridRow).Item as Thing;
  Thing clone = thing.GetClone();
  Editor dialog = new Editor(thing);

  if (dialog.DialogResult ?? false)
    (DataContext as ViewModel).Update();
  else
    (sender as DataGridRow).Item = clone;
}

但是,保留用于创建副本(IClonable is deprecated)的扩展方法以及所有来回移动smells a little的方法很不方便。有没有更简洁的方法来解决它?

我能想到的唯一另一种方法(我们在这里谈论一个懒人的解决方案)就是简单地重新创建原始数据上下文,从而像DB一样刷新所有内容。

private void DataGridRow_OnClick(Object sender, MouseButtonEventArgs eventArgs)
{
  Editor dialog = new Editor((sender as DataGridRow).Item as Thing);

  if (dialog.DialogResult ?? false)
    (DataContext as ViewModel).Update();
  else
    DataContext = new ViewModel();
}

思想?

1 个答案:

答案 0 :(得分:0)

我从专家教程中看到了许多不同的解决方案。

一种方法是将原始值复制到一个基本结构中,您可以通过复制值来恢复它。

一种方法是将模型POCO对象中的值复制到ViewModel属性中,并仅在确认时应用更改。

有很多方法可以达到相同的效果。这只是一个偏好问题。