WPF MVVM-如何在单击按钮时从MainWindowViewModel显示视图
可能重复:WPF MVVM-如何在单击按钮时从MainWindowViewModel显示视图,wpf,mvvm,Wpf,Mvvm,可能重复: 朋友们好, 我有两个视图MainWindowView和AddCustomerView。我在MainwindowView.xmal中有包含按钮的菜单 如何通过单击按钮从MainWindowViewModel弹出添加CustomerView。 我的App.xmal.cs的启动代码是 base.OnStartup(e); MainWindow window = new MainWindow(); var viewModel = new MainWindowViewModel(); win
朋友们好, 我有两个视图MainWindowView和AddCustomerView。我在MainwindowView.xmal中有包含按钮的菜单 如何通过单击按钮从MainWindowViewModel弹出添加CustomerView。 我的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
}
看看这个“深潜MVVM视频”。Laurent Bugnon展示了IDialogService的概念,并很好地解释了这些概念。。。另外,源代码也应该是可用的。。。
这些概念也适用于wpf
HTH在视图中处理它
可能是最简单的方法
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);
}
}
在视图中处理它
var viewModel = new MainWindowViewModel();
viewModel.AddCustomerViewShowed += (s, e) => new AddCustomerView(data).Show();
处理所有视图的控制器
中介模式
一些MVVM框架(例如)使用这种模式
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(...));
}
}
公共类应用程序//或在视图中或其他地方
{
公共作废登记员()
{
Messenger.Default.Register(这是ProcessAddCustomerMessage);
}
私有无效进程AddCustomerMessage(AddCustomerMessage消息)
{
AddCustomerView视图=新的AddCustomerView(数据);
view.Show();
}
}
公共类MainWindowViewModel
{
public void AddNewCustomerWindowExecute()
{
senger.Default.Send(newaddCustomerMessage(…);
}
}
谢谢,但我是WPF-MVVM的新手,我不理解这个复杂的代码。@Killerfish我向您介绍了4种不同的方法。挑一个你最喜欢的好吧,非常感谢。!这个解决方案看起来不错。我使用了它,但我不确定它是否是一个好的解决方案,因为我不得不向App.cs添加另一个非静态构造函数。您能给我一个提示,我应该在哪里正确注册负责显示视图的消息?应用程序是一个好的解决方案?或者是定位器,但是定位器呢?我将非常感谢您的建议。回答很好,谢谢,它帮助了我:)+1由于某种原因,9频道的视频无法播放。但是,如果您单击视频显示区域下方并选择“High Quality MP4”超链接,它将播放。所有其他链接将给您一个404未找到错误。
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(...));
}
}