【问题标题】:WPF MVVM - How to Show a view from MainWindowViewModel upon Clicking on button [duplicate]WPF MVVM - 如何在单击按钮时从 MainWindowViewModel 显示视图 [重复]
【发布时间】:2011-08-15 07:46:54
【问题描述】:

可能重复:
The best approach to create new window in WPF using MVVM

朋友们好,

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

【问题讨论】:

    标签: wpf mvvm


    【解决方案1】:

    在视图中处理

    可能是最简单的方法。

    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();
    

    处理所有视图的控制器

    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,我不理解这个复杂的代码。
    • @Killerfish 我向您介绍了 4 种不同的方法。选择一个你最喜欢的
    • 好的,非常感谢!
    • 该解决方案看起来不错。我使用它 - 有效,但我不确定它是否是一个好的解决方案,因为我必须向 App.cs 添加另一个非静态构造函数。您能否给我一个提示,我应该在哪里正确注册负责显示视图的消息?应用程序是一个很好的解决方案?或者也许是定位器,但是定位器?我将不胜感激。
    • 很好的答案,谢谢,它帮助了我:) +1
    【解决方案2】:

    观看此“深入了解 MVVM 视频”。 Laurent Bugnion 展示了 IDialogService 的概念,并很好地解释了这些概念......加上源代码也应该可用...... 这些概念也适用于 wpf

    http://channel9.msdn.com/Events/MIX/MIX11/OPN03

    HTH

    【讨论】:

    • 由于某种原因,第 9 频道的视频无法播放。但是,如果您单击视频显示区域下方并选择“高质量 MP4”超链接,它将播放。所有其他链接都会给你一个 404 not found 错误。
    猜你喜欢
    • 2014-04-24
    • 1970-01-01
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    • 1970-01-01
    • 2021-02-12
    相关资源
    最近更新 更多