在我的网格中,点击一下,我将整行的项目提供给另一个窗口(模态对话框),并将其作为数据上下文。当用户完成后,只有在对话框的结果为真时才会对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();
}
思想?
答案 0 :(得分:0)
我从专家教程中看到了许多不同的解决方案。
一种方法是将原始值复制到一个基本结构中,您可以通过复制值来恢复它。
一种方法是将模型POCO对象中的值复制到ViewModel属性中,并仅在确认时应用更改。
有很多方法可以达到相同的效果。这只是一个偏好问题。