MVVM中的配置对话框窗口

4
我对MVVM相对较新。我的当前问题是一个模块化对话框,应该在开头“自动启动”。
我遵循了WAF的邮件客户端示例以获得模块化对话框。设置对话框的Owner属性为应用程序主窗口的实例(当然要使用ShowDialog()而不是Show())是唯一重要的事情吗?
如果您关闭此对话框而没有配置,则应用程序将关闭。但是,如果我在Visual Studio设计器模式下打开主窗口,配置对话框会出现,如果我关闭它,Visual Studio就会崩溃。这是因为我在我的主窗口视图模型的构造函数中调用了配置对话框的ShowDialog()。
为了避免这种情况,我可以检查DesignerProperties.IsInDesignTool属性,但是这更像是解决方法而不是良好的代码风格,对吗?
你有什么建议吗?谢谢。

也许在未来的VisualStudio版本中,他们会支持MVVM编码方式,但现在你应该满足于这些解决方法。我不知道除了使用DesignerProperties.GetIsInDesignMode之外还有其他方法可以防止VisualStudio崩溃。 - Musaab
1个回答

4
问题在于你在类的构造函数中显示了一个对话框,这是不应该做的事情。
我会像这样解决:
不要在app.xaml中指定StartupUri,而是重写OnStartup。在那里,你可以检查是否应该显示配置对话框。如果需要显示,就显示它,在它关闭并返回“OK”后,再显示主窗口。

像这样:

override void OnStartup(...)
{
    if(configurationNotComplete)
    {
        ConfigDialog cfg = new ConfigDialog();
        if(!(cfg.ShowDialog() ?? false))
        {
            Shutdown();
            return;
        }
    }
    MainWindow window = new MainWindow();
    window.Show();
}

您当前的方法存在一个问题:您的ViewModel显示了一个模态对话框。这意味着它至少知道一个View:模态对话框的View。MVVM是单向的:View知道ViewModel,ViewModel知道Model。不应该有反向连接。

Mh的code-behind?MVVM的一个原则不是尽可能避免使用code-behind吗? - Felix C
视图中的代码后台,是的。应用程序类不是视图。此外,这种方法比您使用的方法更清洁。 - Daniel Hilgarth
好的,应用程序类可以知道所有视图吗?你能解释一下模态对话框和“普通”对话框之间的区别吗?我一直认为模态对话框会使背景变灰,而普通对话框不会(因为这种效果在jQuery的模态对话框中)。 - Felix C
这取决于您的术语。模态对话框会禁用其父窗口。一个“对话框”往往是一个模态对话框。如果您明确指的是非模态对话框,您需要明确说明。 - Daniel Hilgarth
这意味着调用ShowDialog()总是使我的对话框模态吗?那么非模态对话框和通过Show()方法显示的第二个窗口之间有什么区别? - Felix C
1
ShowDialog 在对话框关闭后返回,而 Show 直接返回。非模态对话框通常使用 Show 显示。 - Daniel Hilgarth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接