我仍然试图抓住WPF和MVVM并偶然发现问题,简单的方法似乎违反了MVVM规则。
据我了解,在MVVM中,视图模型不允许了解视图。因此,如果我将视图和视图模型放在不同的程序集中,则不允许视图模型程序集引用视图程序集。
所以,这是我的问题:
假设我有一个MainView和一个相应的MainViewModel。 MainView有一个按钮,可以关闭窗口并在关闭之前做一些严肃的事情(例如保存数据和配置)。 此按钮绑定到MainViewModel中的CloseCommand,但我如何在MainViewModel中知道要关闭哪个视图。 我的简单(和错误)方法是在初始化时为MainViewModel提供MainView的实例,或者将视图关闭作为命令参数。 但这两种解决方案都违反了MVVM规则。
假设我的MainView包含一个绑定到MainViewModel的字符串属性的TextBox。如果用户在TextBox中键入的文本不够独特,我想打开一个新的模态窗口,用户可以从中选择各种选择。
要在WPF中打开模式窗口,您必须将MainView放在新窗口的Owner
属性中。因此,您需要在MainViewModel中引用MainView。
如果您尝试显示模式消息框(与父窗口关联且不能通过鼠标单击或其他用户操作放在父窗口后面的消息框),则存在同样的问题。
那么,当您需要有关视图的知识时,如何在视图模型中执行操作?
感谢您的帮助。
答案 0 :(得分:0)
好像你想关闭主窗口,这很好。尽管如此,这可以通过新的抽象级别来解决。假设您有一个名为IApplication
的接口,其方法为Close()
。然后假设你有一个接口的实现,可能看起来像:
class ApplicationWrapper : IApplication
{
public void Close()
{
Application.Current.MainWindow.Close();
}
}
您是否无法在视图模型中注入IApplication
接口并从命令调用其Close
方法?
我建议MVVM Dialogs,但由于我也是作者,所以我有偏见。