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

本文关键字:上下文 原始 数据 恢复 取消 编辑 对话框 | 更新日期: 2023-09-27 18:06:49

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

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

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

这是很明显的,一旦一个人想到它,因为我们绑定到一个对象(调用引用),同时提供编辑对象的模态窗口的构造器。但几乎没有什么能满足用户的期望。

我将在一个解决方案中编写代码,创建最初发送的对象的副本,然后恢复它,如果没有执行对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已弃用),而且所有的来回变换都有点难闻。有没有更好的方法来解决这个问题?

我能想到的唯一另一种方法(我们在这里讨论的是懒人的解决方案)是简单地重新创建原始数据上下文,从而像这样从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();
}

想法吗?

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

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

一种是将原始值复制到基本结构体中,可以通过从。

复制值来恢复到基本结构体。

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

有许多方法可以达到相同的结果。