从ViewModel打开新窗口

Der*_*ler 4 c# wpf mvvm

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

EventArgs的:

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

    public GenericViewRequestedEventArgs(GenericViewModel viewModel)
    {
        ViewModel = viewModel;
    }
}
Run Code Online (Sandbox Code Playgroud)

视图模型:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

视图:

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

这确实有效,但它似乎是很多代码,我最终在我的视图中以任何方式使用代码.

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

Gee*_*rik 5

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

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

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

**免责声明**

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