如何在MVVM下的同一屏幕上实现CRUD Master Details

时间:2010-02-12 04:56:55

标签: c# wpf mvvm prism

我有一个MVVM(Prism)应用程序,我需要实现一个主详细信息屏幕,主机是列表视图,旁边会显示详细信息。只读似乎很容易(还没有完成它但我已经掌握了WPF绑定)但编辑/添加让我感到困惑。

如何保存,以便在保存详细信息之前不更新主文件? 如何制作它以便在编辑/添加模式下无法更改主控的当前选择?

我一直在谷歌搜索,但没有找到任何肉食的例子。

感谢。

PS:此视图是较大屏幕上的子视图。这就是为什么我要同时掌握主人和细节。

2 个答案:

答案 0 :(得分:1)

你当然可以这样做,但在我看来,这样的UI设计无法充分利用WPF的全部功能。旧的WinForms UI通常不会更新大部分应用程序,直到数据保存到SQL Server(或任何地方),因为它们没有真正的业务对象和强大的绑定系统,如WPF。试图在WPF中复制WinForms限制似乎是向后退一步。为什么不在UI中显示最新数据,包括在主视图中?另外,为什么不允许用户在保存之前编辑多个项目,例如在主视图中使用动画标记标记任何已编辑但未保存的项目?将这些与广义撤消相结合,您可以为用户提供更好的设计和更直观的设计。

但是,如果您的业务需求绝对必要,请按以下步骤操作:

防止数据更改在详细信息之外显示,直到保存为止

进入“编辑/添加模式”后,复制数据对象并将详细视图的DataContext设置为副本而不是活动对象。当数据被“保存”时,将数据从卷影副本复制回实时对象,并将详细视图的DataContext设置回原来的位置。

在编辑/添加模式下阻止主人当前选择更改

两种可能性:

  1. 在编辑/添加模式下,更改主视图以禁止鼠标点击测试或键盘焦点

  2. 当编辑/添加模式开始时,捕获“当前选择”,然后添加一个监视“当前选择”更改的事件处理程序,并立即将选择更改回原来的选择。编辑/添加模式结束时,删除处理程序。可以使用lambda表达式方便地编码此处理程序,并使用局部变量上的闭包来存储当前选择。

答案 1 :(得分:0)

感谢您的回答。现在我重新阅读了我的信息,我觉得它很模糊。我有一个屏幕编辑一个对象,其中包含多个其他子对象列表。我已将它们实现为选项卡控件中的不同选项卡。其中一个选项卡会编辑注释,因此我希望显示一个注释列表,其中包含列表旁边当前选择的编辑面板。然后,用户可以使用添加,编辑或删除按钮来更新列表。我想用纯粹的(ish)MVVM方式做到这一点。

我提出了以下设计,这似乎与最小的黑客一起工作。

View包含一个子对象列表,就像一个ListView绑定到ViewModel中的一个可观察集合。我包含了一个子对象缓冲区 - 这用于缓冲更改,直到它们准备好保存回列表(或丢弃)。

View还包含一个绑定到ViewModel中缓冲区对象的编辑面板。只要列表视图的当前选择使用深层副本更改,就会更新缓冲区。我尝试在Selecteditem属性上使用数据绑定,但从未调用过set,因此添加了一个小的代码隐藏方法,以便在更改选择时强制更新属性。

列表视图和编辑视图是互斥的。从理论上讲,您可以使用翻转屏幕隐藏残疾人。作为一般模式,我的应用程序最好同时显示两者,因为编辑面板可能会显示列表视图中未显示的额外信息。关于启用哪个面板的选择是通过将IsEnabled绑定到像IsEditCommentMode这样的ViewModel属性来控制的。

必须添加管理列表的命令,这些命令是New,Edit和Delete。请注意,添加和编辑将设置缓冲区,然后将IsEditCommentMode设置为true。这些列表管理命令仅在IsEditCommentMode为false时可用。 编辑面板实现了“保存”和“取消”命令,只有在IsEditCommentMode为true时才会启用它们。执行保存时,它应该从缓冲区复制到列表(添加或更新)并触发更改通知。最后,它应该将IsEditCommentMode设置为false。

这一切都运作良好,并且似乎没有违反任何MVVM tenents(以我的谦逊但通常有缺陷的观点)。