加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 对话窗口MVVM方式

发布时间:2020-12-15 20:56:06 所属栏目:百科 来源:网络整理
导读:我们在桌面 WPF世界.让我们想象下面的场景(?用户故事). 窗口A是用于在数据库中添加或编辑实体A的对话窗口.其中一个字段是对其他实体的引用.为方便用户,有“添加实体B”按钮. 当用户按下此按钮时,窗口B正在显示,它提供类似的角色 – 添加或编辑实体B.当用户按
我们在桌面 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);
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读