我继承了一个使用view-first MVVMC patern的应用程序
在应用程序中,我创建了两个步骤,创建一个人并将其分配给一个组。为此,我创建了一个视图和相应的视图模型(所有视图都与视图模型有1-2-1的关系,视图模型注入到View构造函数中,并使用TransientLifetimeManager在Unity容器中注册)名为CreatePersonMaster ,视图只包含一个区域(由虚线显示),可以加载子视图,视图模型订阅两个松散耦合的事件,“PersonCreated”和“GroupSelected”。 “PersonCreated”事件将Person实体保存在字段中,“GroupSelected”事件获取已保存的Person,创建Group关联并将其保存到数据库。
在事件被引发之前,此视图/视图模型不执行任何操作,因此我将以下子视图加载到我的区域中。
这些视图/视图模型触发由主视图处理的事件。
我还有一个编辑视图,我想重新使用选择组视图。
我可以通过订阅EditPersonMaster视图模型中的相应事件来完成此操作。
我的问题是,这是适当的方法吗?因为我正在使用松耦合事件,所以如果在创建/重新分配时出错,我不会得到子视图/ ViewModel的任何反馈?我可能会为内部视图/模型触发另一个“ErrorBlah”事件来处理和更新视图。
还有其他办法吗?复合命令似乎不符合要求,但我可能无法正确理解它们。
答案 0 :(得分:0)
以下是我理解您的问题的方法:您将人员存储在数据库中,该数据库具有属性/列group
。在UI中,您希望创建人员并分配组属性。此外,您希望能够编辑不同区域/页面/母版中现有人员的组属性。您希望重用该控件来分配组。您的控件会触发一个事件,该事件由Master以一种在数据库中创建条目的方式处理(这是正确的吗?)。你的问题是这是一个好方法,你有什么替代方案?
我看到两个选项:
<强> 1。模块化您的业务逻辑:
您可以将数据服务注入ViewModels,ViewModel可以直接访问数据库。通过这种方式,您可以直接处理错误等等,并且不必将它们传递给整个系统。如果要通知其他模块数据库中的更改(指定更改的数据集等),可以使用复合事件执行此操作。我认为PRISM模块更像是完整的元素,包括UI和业务逻辑,并尽可能少地保持它们之间的通信。
<强> 2。保持您的业务逻辑中心并分享它:
如果您想坚持您的架构,请将单一模型注入ViewModel。在模型中管理您的状态,让ViewModel选择他们想要提供给他们视图的部分。
希望我明白他的意思......