微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 对话窗口MVVM方式

我们在桌面 WPF世界.让我们想象下面的场景(〜用户故事).

窗口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讨论了类似的问题.但是,我有一些可能的解决方案,可能有效也可能无效,我想知道它们是否可以使用(因为在讨论的问题中提出的解决方案对我来说似乎有些过分).

解决方法

caliburn.micro世界中,您可以使用IWindowManager.ShowDialog(ModelView)执行此操作.

使用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] 举报,一经查实,本站将立刻删除。

相关推荐