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

可能重复:

朋友们好,

我有两个视图MainWindowViewAddCustomerView。我在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(...));
    }
}