使用WPF MVVM模式打开新窗口的最佳实践

Jen*_*ens 20 wpf mvvm

我一直在想这个问题......从另一个视图模型中打开一个新窗口(view&viewmodel)的最佳做法是什么如果我们记住打开新窗口的viewmodel不知道是否存在那个观点(应该如此).

谢谢.

Dea*_*alk 13

我更喜欢使用通过ViewModel构造函数插入的动作委托.这也意味着我们可以在单元测试期间轻松验证:

public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();
        DataContext = new MainViewModel(() => (new Window()).Show()); // would be actual window
    }
}

public class MainViewModel
{
    private Action popupAction;
    public MainViewModel(Action popupAction)
    {
        this.popupAction = popupAction;
    }

    public ICommand PopupCommand { get; set; }

    public void PopupCommandAction()
    {
        popupAction();
    }
}

public class SomeUnitTest
{
    public void TestVM()
    {
        var vm = new MainViewModel(() => { });
    }
}
Run Code Online (Sandbox Code Playgroud)

  • +1优雅(不使用第三方库)并展示我以前从未见过的东西. (2认同)

jbe*_*jbe 5

我不使用ViewModel打开另一个View / ViewModel。这是控制器的责任。ViewModel可以(例如通过事件)通知Controller用户希望看到下一个View。控制器借助IoC容器创建View / ViewModel。

WPF应用程序框架(WAF)的ViewModel(EmailClient)示例应用程序中显示了它的工作方式。