窗口A是用于在数据库中添加或编辑实体A的对话窗口.其中一个字段是对其他实体的引用.为方便用户,有“添加实体B”按钮.
当用户按下此按钮时,窗口B正在显示,它提供类似的角色 – 添加或编辑实体B.当用户按下OK时,实体被添加到数据库并返回,这样它可以被窗口A用来设置它自动在某些领域.
现在让我们讨论技术问题. WindowA由WindowAviewmodel支持.按下按钮会调用WindowAviewmodel.CreateBEntity方法.然后什么?
>我不能简单地创建Window B的实例,因为这将创建从WindowAviewmodel到WindowB的依赖,这是我不想做的事情.
> WindowAviewmodel可以通过接口调用WindowA,比如说IWindowAAccess要求新的EntityB.然后WindowA可以实例化WindowB,然后接收新创建的实体并将其传递回WindowAviewmodel.这会在WindowA和EntityB之间产生依赖关系,但我猜这是可以接受的.或不?
> WindowAviewmodel可能会要求某些IDialogService执行整个操作.然后实现,DialogService将创建WindowB并执行整个操作,返回EntityB.但是,从服务到特定视图创建依赖关系是否可以接受?
编辑:Another question讨论了类似的问题.但是,我有一些可能的解决方案,可能有效也可能无效,我想知道它们是否可以使用(因为在讨论的问题中提出的解决方案对我来说似乎有些过分).
解决方法
使用IoC,在Bootstrapper中将WindowManager注入IWindowManager,并将IWindowManager添加到viewmodel构造函数中.手中有IWindowManager,请调用ShowDialog.
代码示例:
public class AppBootstrapper : BootstrapperBase { // ... protected override void Configure() { container.Singleton<IWindowManager,WindowManager>(); } } public class Callingviewmodel { private readonly IWindowManager windowManager; public Callingviewmodel(IWindowManager windowManager) { this.windowManager = windowManager; } public Method() { var called = new Calledviewmodel(); var result = windowManager.ShowDialog(called); // handle result } } public class Calledviewmodel : Screen { public void Ok() { TryClose(true); } public void Cancel() { TryClose(false); } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。