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

标签 wpf mvvm

这个问题在这里已经有了答案:




10年前关闭。




Possible Duplicate:
The best approach to create new window in WPF using MVVM



你好 friend ,

我有两个 View 主窗口 View 添加客户 View .我在 MainwindowView.xmal 中有包含按钮的菜单。

我怎么会弹出通过单击按钮从 MainWindowViewModel AddCustomerView。

我的 App.xmal.cs 启动代码是..
base.OnStartup(e);
MainWindow window = new MainWindow();
var viewModel = new MainWindowViewModel();
window.DataContext = viewModel;
window.Show();

在按钮执行代码中显示 AddCustomerView 的代码是什么。
 public void AddNewCustomerWindowExecute() //This is button handler
 {
     // How to show AddCustomerView from MainWindowViewModel
 }

最佳答案

在 View 中处理

可能是最简单的方法。

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

ViewModel 暴露一个事件

这有一个缺点:它需要大量的手动编码。
public class MainWindowViewModel 
{
    public event EventHandler AddCustomerViewShowed;

    public void AddNewCustomerWindowExecute()
    {
        if (AddCustomerViewShowed != null)
            AddCustomerViewShowed(this, EventArgs.Empty);
    }
}

在 View 中处理
var viewModel = new MainWindowViewModel();
viewModel.AddCustomerViewShowed += (s, e) => new AddCustomerView(data).Show();

处理所有 View 的 Controller
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();
    }
}

中介模式

一些 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(...));
    }
}

关于WPF MVVM - 如何在单击按钮时从 MainWindowViewModel 显示 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5829413/

相关文章:

WPF 数据网格 : Resource per row?

wpf - TextBlock 触发器而不是使用转换器

c# - 从隐藏代码更改 UWP 按钮的可见性

C# 获取当前光标图标

c# - 在WPF中使用数据绑定(bind)时如何避免递归循环?

.net - 如何使用局部变量用两个 UserControl 之一填充 MainWindow

c# - WPF中的字符串计算器,在ViewModel中填充文本框

wpf - 无法在 WPF MVVM 应用程序中动态设置焦点

c# - WPF如何从MVVM中的动态对象更改属性标签

wpf - 使用触发器更改 xaml 中的图像源无法正常工作