我有一个MVVM (棱镜)应用程序,我需要实现一个主详细信息屏幕,无论主是列表视图,并且详细信息显示在它旁边。只读似乎很简单(还没有做到,但我已经掌握了WPF绑定),但编辑/添加让我感到困惑。
如何使其在保存详细信息之前不更新主文件?我怎样才能让你在编辑/添加模式下不能改变母版的当前选择?
我已经在谷歌上搜索了很多,但还没有找到任何有价值的例子。
谢谢。
PS:这个视图是一个大屏幕上的子视图。这就是为什么我想要主细节都在一起的原因。
发布于 2010-02-15 11:54:59
谢谢你的回答。现在我重读了我的信息,我看到它是相当模糊的。我有一个编辑对象的屏幕,其中包含其他子对象的多个列表。我已经将它们实现为选项卡控件中的不同选项卡。其中一个选项卡可以编辑注释,所以我想在列表旁边显示一个注释列表,其中包含当前选定内容的编辑面板。然后,用户可以使用添加、编辑或删除按钮来更新列表。我想用一种纯粹的MVVM方式来做这件事。
我想出了下面的设计,它似乎可以用最少的hack来工作。
该视图包含一个子对象列表,只是作为绑定到ViewModel中的可观察集合的ListView。我包含了一个子对象缓冲区-它用于缓冲更改,直到它们准备好保存回列表中(或被丢弃)。
该视图还包括绑定到ViewModel中的buffer对象的编辑面板。每当列表视图的当前选择使用深度副本发生更改时,都会更新缓冲区。我尝试在Selecteditem属性上使用数据绑定,但从未调用过该set,因此添加了一个小的代码隐藏方法,以便在更改选择时强制更新该属性。
列表视图和编辑视图是互斥的。从理论上讲,你可以隐藏禁用的那个,也许可以使用翻转屏幕。一般来说,对于我的应用程序来说,最好同时显示这两者,因为编辑面板可能会显示列表视图中没有显示的额外信息。选择启用哪个面板是通过将IsEnabled绑定到ViewModel属性(如IsEditCommentMode )来控制的。
必须添加管理列表的命令,这些命令是新建、编辑和删除。请注意,添加和编辑将设置缓冲区,然后将IsEditCommentMode设置为true。这些列表管理命令仅在IsEditCommentMode为false时可用。编辑面板实现保存和取消命令,它们仅在IsEditCommentMode为true时启用。当执行Save时,它应该从缓冲区复制到列表(添加或更新),并触发更改通知。最后,它应该将IsEditCommentMode设置为false。
这一切都运行良好,似乎没有违反任何MVVM租期(在我的谦虚,但经常有缺陷的意见)。
发布于 2010-02-12 16:57:38
您当然可以做到这一点,尽管在我看来,这样的UI设计不能充分利用WPF的全部功能。旧的WPF通常在数据保存到SQL Server (或其他任何地方)之前不会更新大部分应用程序,因为它们没有真正的业务对象和像WinForms这样强大的绑定系统。在我看来,在WPF中复制WinForms的限制似乎是一种倒退。为什么不在UI中显示最新数据的任何地方,包括在主视图中?此外,为什么不允许用户在保存之前编辑多个项目,例如在主视图中使用动画标记标记任何已编辑但未保存的项目?将这些与通用的撤销相结合,你就会有一个更好的设计,对用户来说也更直观。
然而,如果您的业务需求使它变得绝对必要,以下是如何做到这一点:
防止在保存数据之前,对数据所做的更改在详细信息之外不可见
进入“编辑/添加模式”后,复制数据对象,并将详细视图的DataContext设置为该副本,而不是活动对象。“保存”数据后,将数据从卷影副本复制回活动对象中,并将详细视图的DataContext设置回应在的位置。
处于编辑/添加模式时,防止主机的当前选择发生更改
有两种可能性:
https://stackoverflow.com/questions/2249751
复制相似问题