这个问题在这里已经有了答案:
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/