如何以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对话框,但我有偏见,因为我也是作者。