0

我继承了一个使用视图优先 MVMC 模式的应用程序

在应用程序中,我创建了两步流程,该流程创建了一个人并将他们分配给一个组。为此,我创建了一个名为 CreatePersonMaster 的视图和相应的视图模型(所有视图与视图模型具有 1-2-1 关系,视图模型被注入到 View 构造函数中,并使用 TransientLifetimeManager 向 Unity 容器注册) ,视图只包含一个区域(由虚线显示),可以将子视图加载到该区域中,并且视图模型订阅两个松散耦合的事件,“PersonCreated”和“GroupSelected”。“PersonCreated”事件将 Person 实体保存在字段中,“GroupSelected”事件获取保存的 Person,创建组关联并将它们保存到数据库。

在引发事件之前,此视图/视图模型不会执行任何操作,因此我将以下子视图加载到我的区域中。

创建人员视图

这些视图/视图模型触发由主视图处理的事件。

我还有一个编辑视图,我想在其中重新使用选择组视图。

编辑人员视图

我可以通过订阅 EditPersonMaster 视图模型中的适当事件来做到这一点。

我的问题真的是,这是正确的方法吗?因为我使用的是松散耦合的事件,所以如果在创建/重新分配时出现错误,我不会在子视图/视图模型中得到任何反馈?我可能会为内部视图/模型触发另一个“ErrorBlah”事件来处理和更新视图。

还有另一种方法可以做到这一点吗?复合命令似乎不符合要求,但也许我没有正确理解它们。

4

1 回答 1

0

我是这样理解您的问题的:您将人员存储在数据库中,该数据库具有 property/column group。在您的 UI 中,您想要创建人员并分配组属性。此外,您希望能够编辑不同区域/页面/母版中现有人员的组属性。您想重复使用控件来分配组。您的控件触发一个事件,该事件由 Master 以在数据库中创建条目的方式处理(正确吗?)。您的问题是这是否是一种好方法以及您有哪些选择?

我看到两个选项:

1. 模块化你的业务逻辑:

您可以将数据服务注入到您的 ViewModel 中,它可以直接访问数据库。这样,您可以直接在它们发生的地方处理错误等,而不必将它们传递给整个系统。如果您想通知其他模块数据库的更改(指定更改的数据集等),您可以使用复合事件来执行此操作。我认为 PRISM 模块更像是完整的元素,包括 UI 和业务逻辑,并尽可能少地保持它们之间的通信。

2. 保持您的业务逻辑集中并共享它:

如果您想坚持您的架构,请将单例模型注入到 ViewModel 中。在模型中管理您的状态,并让 ViewModels 选择他们想要提供给他们的视图的部分。

希望我明白他的意思,虽然...

于 2013-04-05T17:09:04.467 回答