WPF入门到跪下 第九章 MVVM-跨模块交互

这篇具有很好参考价值的文章主要介绍了WPF入门到跪下 第九章 MVVM-跨模块交互。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

MVVM模式下的跨模块交互

在实际开发过程中,经常会遇到多个窗口对象,随之而来的就是对应的多个ViewModel对象,这些对象在一定条件下会发生相互访问的情况,例如VM与不同窗口交互、VM与不同VM交互,这些不同模块对象之间的交互,就是跨模块交互。

MVVM模式下跨模块交互解决方案
面对跨模块交互,常规的解决方案是创建一个“第三方”来作为交互的中转站。

创建一个窗体管理类型,作为第三方

public class WindowManager
{
	private static Dictionary<string, WinEntity> _windows = new Dictionary<string, WinEntity>();

	/// <summary>
	/// 窗体类型注册
	/// </summary>
	/// <param name="type"></param>
	/// <param name="owner"></param>
	public static void Register(Type type, Window owner)
	{
	    _windows.Add(type.Name, new WinEntity { 
	        Type = type,
	        Owner = owner
	    });
	}
	//展示对应的窗口
	public static bool ShowDialog(string winKey, object dataContext)
	{
	    if (_windows.ContainsKey(winKey))
	    {
	        Type type = _windows[winKey].Type;
	        var win = (Window)Activator.CreateInstance(type);
	        //指定所展示的窗口对象的拥有者,设置后子窗口跟主窗口会关联展示
	        win.Owner = _windows[winKey].Owner;
	        //传递上下文参数
	        win.DataContext = dataContext;
	        return win.ShowDialog()==true?true:false;
	    }
	    return false;
	}
}

class WinEntity
{
    public Type Type { get; set; }
    public Window Owner { get; set; }
}

主窗口做窗口类型注册

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        //进行窗体对象类型的注册,后面通过反射获得对应的窗体对象,这里的SecondWindow只是一个简单的显示Hello的窗口
        WindowManager.Register(typeof(SecondWindow), this);
    }
}

命令类型创建

public class CommandBase : ICommand
{
    public event EventHandler CanExecuteChanged;
    public void DoCanExecuteChanged()
    {
        CanExecuteChanged?.Invoke(this, EventArgs.Empty);
    }

    public Func<object, bool> DoCanExecute { get; set; }
    public bool CanExecute(object parameter)
    {
        return DoCanExecute(parameter);
    }

    public Action<object> DoExecute { get; set; }
    public void Execute(object parameter)
    {
        DoExecute(parameter);
    }
}

ViewModel层

public class MainViewModel
{
    public MainModel MainModel { get; set; }
    public CommandBase CommandBase { get; set; }
    
    public MainViewModel()
    {
        CommandBase = new CommandBase
        {
            DoExecute = DoExecute,
            DoCanExecute = DoCanExecute
        };

        MainModel = new MainModel();
    }

    private void DoExecute(object obj)
    {
        //创建并设置VM对象,传递给所访问的窗体对象
        MainViewModel mainViewModel = new MainViewModel();
        mainViewModel.MainModel.Value = 123;
        //跨模块调用窗体对象
        if (WindowManager.ShowDialog("SecondWindow", mainViewModel))
        {
            //根据窗口的操作结果来进行不同的业务逻辑
        }
        else
        {

        }
    }

    private bool DoCanExecute(object obj)
    {
        Debug.WriteLine("DoCanExecute......");
        return true;
    }
}

Model层

public class MainModel
{
    public int Value { get; set; }
}

以上的做法,将对应的窗口类型剥离出来,由WindowManager统一管理,实现各个模块之间的相互隔离。这个方式不仅仅用于ViewModel层访问窗口对象,还能针对不同的跨模块访问情况做出不同的调整。例如跨模块访问方法的ActionManager可以如下编写:文章来源地址https://www.toymoban.com/news/detail-788002.html

public class MethodManager<T>
{
    private Dictionary<string, Func<T>> _methods = new Dictionary<string, Func<T>>();

    public void Register(string name, Func<T> func)
    {
        _methods.Add(name, func);
    }

    public T Invoke(string name)
    {
        return _methods[name].Invoke();
    }
}

到了这里,关于WPF入门到跪下 第九章 MVVM-跨模块交互的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • WPF真入门教程23--MVVM简单介绍

    WPF真入门教程23--MVVM简单介绍

            在WPF开发中,经典的编程模式是MVVM,是为WPF量身定做的模式,该模式充分利用了WPF的数据绑定机制,最大限度地降低了Xmal文件和CS文件的耦合度,也就是UI显示和逻辑代码的耦合度,如需要更换界面时,逻辑代码修改很少,甚至不用修改。与WinForm开发相比,我们一般

    2024年02月03日
    浏览(6)
  • WPF入门到精通:3.MVVM简单应用及全局异常处理

    在WPF应用程序开发中,MVVM(Model-View-ViewModel)是一种非常流行的架构模式。它为应用程序的设计提供了良好的分层结构和可扩展性。 结构分为下列三部分 Model:定义了应用程序的数据模型 就是系统中的对象,可包含属性和行为(是一个class实体,是对现实中事物的抽象,开

    2024年02月11日
    浏览(8)
  • WPF入门教程系列二十八 ——DataGrid使用示例MVVM模式(6)

    WPF入门教程系列二十八 ——DataGrid使用示例MVVM模式(6)

    WPF入门教程系列目录 WPF入门教程系列二——Application介绍 WPF入门教程系列三——Application介绍(续) WPF入门教程系列四——Dispatcher介绍 WPF入门教程系列五——Window 介绍 WPF入门教程系列十一——依赖属性(一) WPF入门教程系列十五——WPF中的数据绑定(一)       7.上面Buttom的

    2024年02月09日
    浏览(10)
  • WPF入门教程系列二十七 ——DataGrid使用示例MVVM模式(4)

    WPF入门教程系列目录 WPF入门教程系列二——Application介绍 WPF入门教程系列三——Application介绍(续) WPF入门教程系列四——Dispatcher介绍 WPF入门教程系列五——Window 介绍 WPF入门教程系列十一——依赖属性(一) WPF入门教程系列十五——WPF中的数据绑定(一)       计算机界的顶

    2024年02月07日
    浏览(12)
  • WPF入门教程系列二十九 ——DataGrid使用示例MVVM模式(7)

    WPF入门教程系列二十九 ——DataGrid使用示例MVVM模式(7)

    WPF入门教程系列目录 WPF入门教程系列二——Application介绍 WPF入门教程系列三——Application介绍(续) WPF入门教程系列四——Dispatcher介绍 WPF入门教程系列五——Window 介绍 WPF入门教程系列十一——依赖属性(一) WPF入门教程系列十五——WPF中的数据绑定(一)   接上文 WPF入门教程

    2024年02月10日
    浏览(12)
  • WPF入门教程系列二十八 ——DataGrid使用示例MVVM模式(5)

    WPF入门教程系列二十八 ——DataGrid使用示例MVVM模式(5)

    WPF入门教程系列目录 WPF入门教程系列二——Application介绍 WPF入门教程系列三——Application介绍(续) WPF入门教程系列四——Dispatcher介绍 WPF入门教程系列五——Window 介绍 WPF入门教程系列十一——依赖属性(一) WPF入门教程系列十五——WPF中的数据绑定(一)           通过上面

    2024年02月08日
    浏览(22)
  • Python之第九章 内置模块

    Python之第九章 内置模块

    目录 第九章 内置模块 1.math模块 1.查看: 2.常用方法: 2.random模块 1.查看: ​2.例: 3.random(a,b) 4.random.sample(range(0,20),10) 3.os模块与os.path模块 1.作用 2.目录 3.os模块与操作系统的关系 4.路径 5.判断目录是否存在 6.创建目录 7.删除目录 8.文件或目录的重命名 9.获取文件信息 10.常见

    2024年02月11日
    浏览(16)
  • WPF MVVM

    WPF MVVM

    MVVM=Model+View+ViewModel Model:现实世界中对象抽象的结果,也就是实体模型 View:UI界面 ViewModel:为UI界面服务的模型,可以理解为数据传输对象(DTO) ViewModel和View的沟通有两个方面:数据和操作 传递数据–使用数据属性 传递操作–使用命令属性 很多人不理解MVVM和MVC的区别,我个

    2024年02月16日
    浏览(12)
  • 【WPF MVVM SelectionChanged】

    关于combox 的 selectionChanged 在MVVM 中的使用 ,在网上找了很长时间,很多都是很早以前的方法。但是本人还是在 工控匠 的博文中看到 已替换的方法 如下 由于最新的更新 vs2019/vs2022中已经不支持 System.Windows.Interactivity 并且已经不在维护所以建议使用 Microsoft.Xaml.Behaviors.Wpf 替代

    2024年02月15日
    浏览(13)
  • WPF CommunityToolkit.Mvvm

    WPF CommunityToolkit.Mvvm

    CommunityToolkit.Mvvm(以下简称Toolkit)是WPF最有名的两个框架,一个是Prism,另一个就是Toolkit。 Prism可以看我的Prism详解 WPF Prims框架详解 Toolkit 官方文档 用 CommunityToolkit.Mvvm 加速 MVVM 开发流程 Toolkit简单复写了我们常用的两个方法 一个是 SetProperty,一个是RelayCommand SetProperty,通知

    2024年02月12日
    浏览(9)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包