WPF MVVM - 如何在单击按钮时从MainWindowViewModel显示视图

Kil*_*ish 4 wpf mvvm

可能重复:
使用MVVM在WPF中创建新窗口的最佳方法

你好朋友,

我有两个视图MainWindowViewAddCustomerView.我在MainwindowView.xmal中有包含按钮的菜单.

如何通过单击按钮从MainWindowViewModel弹出AddCustomerView.

我的App.xmal.cs用于启动代码是..

base.OnStartup(e);
MainWindow window = new MainWindow();
var viewModel = new MainWindowViewModel();
window.DataContext = viewModel;
window.Show();
Run Code Online (Sandbox Code Playgroud)

在buttonexecute代码中显示AddCustomerView的代码是什么.

 public void AddNewCustomerWindowExecute() //This is button handler
 {
     // How to show AddCustomerView from MainWindowViewModel
 }
Run Code Online (Sandbox Code Playgroud)

mak*_*mak 22

在视图中处理它

可能是最简单的方法.

private void AddCustomerView_Click(object sender, RoutedEventArgs e)
{
    AddCustomerView view = new AddCustomerView(data);
    view.Show();
}
Run Code Online (Sandbox Code Playgroud)

ViewModel公开一个事件

这有一个缺点:它需要大量的手动编码.

public class MainWindowViewModel 
{
    public event EventHandler AddCustomerViewShowed;

    public void AddNewCustomerWindowExecute()
    {
        if (AddCustomerViewShowed != null)
            AddCustomerViewShowed(this, EventArgs.Empty);
    }
}
Run Code Online (Sandbox Code Playgroud)

在视图中处理它

var viewModel = new MainWindowViewModel();
viewModel.AddCustomerViewShowed += (s, e) => new AddCustomerView(data).Show();
Run Code Online (Sandbox Code Playgroud)

处理所有视图的控制器

public class Controller : IController
{
    public void AddCustomer()
    {
        AddCustomerView view = new AddCustomerView(data);
        view.Show();
    }
}

public class MainWindowViewModel 
{
    IController controler;

    public MainWindowViewModel(IController controller)
    {
        this.controller = controller;
    }

    public void AddNewCustomerWindowExecute()
    {
        controller.AddCustomer();
    }
}
Run Code Online (Sandbox Code Playgroud)

中介模式

一些MVVM框架(例如MVVM Light)使用这种模式.

public class App // or in the view or somewhere else
{
    public void RegisterMessenger()
    {
        Messenger.Default.Register<AddCustomerMessage>(this, ProcessAddCustomerMessage);            
    }

    private void ProcessAddCustomerMessage(AddCustomerMessage message)
    {
        AddCustomerView view = new AddCustomerView(data);
        view.Show();
    }
}

public class MainWindowViewModel 
{
    public void AddNewCustomerWindowExecute()
    {
        Messenger.Default.Send(new AddCustomerMessage(...));
    }
}
Run Code Online (Sandbox Code Playgroud)