从ViewModel打开新窗口

时间:2014-04-11 12:05:51

标签: c# wpf mvvm

我应该如何打开新窗户?我目前正在做以下事情。

EventArgs的:

public class GenericViewRequestedEventArgs : EventArgs
{
    public GenericViewModel ViewModel { get; private set; }

    public GenericViewRequestedEventArgs(GenericViewModel viewModel)
    {
        ViewModel = viewModel;
    }
}

视图模型:

public class MainWindowViewModel : ViewModelBase
{
    private RelayCommand _viewSpecificCommand;

    public ICommand ViewSpecificCommand
    {
        get
        {
            if (_viewSpecificCommand == null)
                _viewSpecificCommand = new RelayCommand(x => viewSpecific());

            return _viewSpecificCommand;
        }
    }

    public EventHandler<GenericViewRequestedEventArgs> GenericViewRequested;

    private void RaiseGenericViewRequested(GenericViewModel viewModel)
    {
        var handler = GenericViewRequested;
        if (handler != null)
            handler(this, new GenericViewRequestedEventArgs(viewModel));
    }

    private void viewSpecific()
    {
        RaiseGenericViewRequested(_specificViewModel);
    }
}

查看:

public partial class MainWindow : Window
{
    private void OnGenericViewRequested(object sender, GenericViewRequestedEventArgs e)
    {
        GenericWindow window = new GenericWindow(e.ViewModel);
        window.ShowDialog();
    }
}

这确实有效,但它看起来像很多代码,我最终在我的视图中以任何方式使用代码。

  • 将命令发送到viewmodel背后的逻辑是什么?
  • 是否只是可选地使用谓词(如果是这样,为什么不绑定到Enabled)并且可能避免将其他视图模型公开为属性?
  • 我应该在XAML中附加简单的事件处理程序(例如Click="btnViewSpecific_Click")吗?

3 个答案:

答案 0 :(得分:5)

这取决于&#34;严格&#34;你想要遵循MVVM模式。这只是MVVM的基本缺陷之一,您可以根据自己的喜好来解决它。一种方法是简单地使用代码隐藏,但是你将如何处理应用程序范围的命令,键盘快捷键等?这是一个有点过于短视的恕我直言。

我认为您至少应该考虑使用几年前解决了这些问题的现有框架,并为您的应用提供坚实的基础。

例如,Catel有一个IUIVisualizerService,可以根据视图模型显示窗口。主要优点是您可以将数据推送到视图模型中并将结果作为服务进行响应。另一个很好的优点是你可以模拟IUIVisualizerService,这样就可以测试对话框提供的不同结果的反应代码。

**免责声明**

我是Catel的开发者,所以我在这里解释了Catel的方式。如果其他人想对其他框架发表评论,请随时发表评论或创建新答案。

答案 1 :(得分:2)

是的,MVVM还有很多其他代码。构建一个独立于Views的命令通常用于单元测试,这样命令和ViewModel可以在不涉及UI组件的情况下进行单元测试。

但是,如果&#34;命令&#34;只是打开一个窗口,创建一个命令是不值得的,并且单元测试该命令以查看是否真的触发了GenericViewRequested(你甚至可以检查是否返回了正确的_specificViewModel)。代码要复杂得多,增加的价值也很少。只需在View的按钮单击事件处理程序中打开窗口,就可以了。

答案 2 :(得分:1)

如果您想查看好的示例,请查看WPF Application Framework (WAF)的ViewModel(EmailClient)示例应用程序中的工作原理。