如何以MVVM的方式打开模式窗口

我仍然试图抓住WPF和MVVM,偶然发现问题,简单的方法似乎违反了MVVM规则。

据我了解,在MVVM中,视图模型不允许了解视图。 因此,如果我将视图和视图模型放入不同的程序集中,则不允许视图模型程序集引用视图程序集。

所以,这是我的问题:

  • 假设我有一个MainView和一个相应的MainViewModel。 MainView有一个应该关闭窗口的按钮,并在关闭之前做一些严肃的事情(例如保存数据和配置)。 此按钮绑定到MainViewModel中的CloseCommand,但是如何在MainViewModel中知道要关闭哪个视图。 我的简单(和错误的)方法是在初始化时给MainViewModel一个MainView的实例,或者将view-to-close作为一个命令参数。 但是这两种解决方案都违反了MVVM规则。

  • 比方说,我的MainView包含绑定到我的MainViewModel的字符串属性的TextBox。 如果文本(用户在文本框中输入的内容)不够独特,我想打开一个新的模式窗口,用户可以从各种选项中选择输入。 要在WPF中打开模式窗口,必须将MainView放入新窗口的Owner属性中。 因此,您需要在MainViewModel中引用MainView。 如果您尝试显示模式消息框(与父窗口绑定的消息框,并且无法通过鼠标点击或其他用户操作将其放在父窗口后面),则存在同样的问题。

  • 那么,当你需要关于视图的知识时,人们应该如何在视图模型中执行操作?

    谢谢你的帮助。


  • 你似乎希望关闭主窗口,这很好。 尽可能多的东西,这可以通过一个新的抽象层次来解决。 假设你有一个叫做IApplication的接口, IApplication有一个方法Close() 。 然后让我们说你有一个接口的实现可能看起来像这样:

    class ApplicationWrapper : IApplication
    {
        public void Close()
        {
            Application.Current.MainWindow.Close();
        }
    }
    

    难道你不能在视图模型中注入IApplication接口并从命令中调用它的Close方法吗?

  • 我会建议MVVM对话框,但我有偏见,因为我也是作者。

  • 链接地址: http://www.djcxy.com/p/56203.html

    上一篇: How to open a modal window the MVVM way

    下一篇: Opening a new window on button click WPF MVVM