wpf 在MVVM中使用IOC思想通过注册窗体的方法实现在ViewModel里面打开其他窗口的方法

这篇具有很好参考价值的文章主要介绍了wpf 在MVVM中使用IOC思想通过注册窗体的方法实现在ViewModel里面打开其他窗口的方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

理论:在MVVM中,View通过添加ViewModel的引用来指定DataContext,也就是View可以引用ViewModel,但ViewModel不可以引用View,而ViewModel在实现逻辑过程中如果需要访问其他的窗体该怎么办呢,比如打开一个对话框,这里通过IOC思想来解决该问题。

1 新建wpf应用

2 新建Views,Models,ViewModels文件夹

3 新建Base文件夹,在其里面添加CommandBase类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;

namespace WpfApp1.Base
{
    public class CommandBase : ICommand
    {
        public event EventHandler CanExecuteChanged;

        public bool CanExecute(object parameter)
        {
            return true;
        }

        public void Execute(object parameter)
        {
            DoExecute?.Invoke();
        }

        public Action DoExecute { get; set; }


        public CommandBase(Action doExecute)
        {
            this.DoExecute = doExecute;
        }
    }
}

4 在Base里面新建WindowManager类,该类就是用IOC思想创建的第三方类,通过其来解耦ViewModel和View,该类通过一个注册方法来注册,并通过显示方法来获取并显示

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;

namespace WpfApp1.Base
{
    public class WindowManager
    {
        private static Dictionary<string, Type> _Windows = new Dictionary<string, Type>();

        public static void Register(Type type,string key)
        {
            if (!_Windows.ContainsKey(key))
            {
                _Windows.Add(key, type);
            }
        }

        public static bool ShowWindow(string key)
        {
            if (_Windows.ContainsKey(key))
            {
                Type type = _Windows[key];
                Window win = (Window)Activator.CreateInstance(type);
                return win.ShowDialog() == true;
            }
            return false;
        }
    }
}

5 在Views里面添加一个窗体Window1,实现对话框功能

<Window x:Class="WpfApp1.Views.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1.Views"
        mc:Ignorable="d"
        Title="Window1" Height="450" Width="800">
    <Grid>
        <Button Content="ok" Click="Button_Click" />
    </Grid>
</Window>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace WpfApp1.Views
{
    /// <summary>
    /// Window1.xaml 的交互逻辑
    /// </summary>
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            this.DialogResult = true;
        }
    }
}

6 在ViewModels里面新建MainViewModel

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
using WpfApp1.Base;
using WpfApp1.Models;

namespace WpfApp1.ViewModels
{
    public class MainViewModel
    {

        public ICommand btnCommand { get; set; }


        public MainViewModel()
        {
            btnCommand = new CommandBase(() =>
            {
                WindowManager.ShowWindow("window1");
            });
        }
    }
}

7 修改MainWindow

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        xmlns:vm="clr-namespace:WpfApp1.ViewModels"
        mc:Ignorable="d" FontSize="30"
        Title="MainWindow" Height="450" Width="800">
    <Window.DataContext>
        <vm:MainViewModel />
    </Window.DataContext>
    <Grid>
        <Button Content="test" Command="{Binding btnCommand}" />
    </Grid>
</Window>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using WpfApp1.Base;
using WpfApp1.Views;

namespace WpfApp1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            WindowManager.Register(typeof(Window1), "window1");
        }
    }
}

注意:在MainWindow的构造函数中将Window1注册到WindowManager中,然后就可以在MainViewModel中通过WindowManger拿到并显示出来文章来源地址https://www.toymoban.com/news/detail-530423.html

到了这里,关于wpf 在MVVM中使用IOC思想通过注册窗体的方法实现在ViewModel里面打开其他窗口的方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • WPF中使用TabControl为每个页签添加不同窗体的方法。

    注:每一个页签添加不同窗体,其实不能叫是窗体,只能叫做控件。我这么起标题主要是方便一些新手来搜索答案。 项目需求: 对于一些上位机控制程序来说,一个窗体根本放不下所有的功能,所以我们通常会使用TabControl控件来进行分类布局。通过选择分类选项卡,来展示

    2024年02月12日
    浏览(41)
  • Winform窗体使用IOC容器

    Winform窗体如何使用IOC容器呢?在nuget中添加Microsoft.Extensions.DependencyInjection 接着在Program类Main方法中添加一下代码 在此类中继续补充以下代码 以后你的注入只需要在 static void ConfigureServices(IServiceCollection services)这个方法中注入就行了 全景图:   我把窗体也注入了,不过不是

    2024年02月12日
    浏览(51)
  • 【自动化】在WPF应用程序中使用MVVM框架实现Modbus协议通信

    Modbus是一种广泛应用于工业领域的通信协议,主要用于设备间的数据交换。在WPF应用程序中,我们可以使用MVVM(Model-View-ViewModel)框架来实现Modbus协议的通信。本文将详细介绍如何实现这一功能。 为了在WPF应用程序中实现Modbus协议通信,我们需要安装一些第三方库。可以使用

    2024年03月22日
    浏览(45)
  • wpf中窗体的移动通用解决方法

    需求背景:设置了不允许改变窗口大小(在Window标签中设置ResizeMode为NoResize),之后窗口无法被拖动 1.在Window标签中添加’MouseLeftButtonDown‘,并且生成事件处理程序 2.到后台的相应事件处理程序中添加

    2024年02月16日
    浏览(38)
  • 循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(8) -- 使用Converter类实现内容的转义处理

    在我们WPF应用端的时候,和WInform开发或者Vue前端开发一样,有时候也需要对内容进行转义处理,如把一些0,1数值转换为具体含义的文本信息,或者把一些布尔变量转换为是否等,都是常见的转换处理,本篇随笔介绍在WPF应用端对内容使用Converter类实现内容的转义处理的操作。

    2024年02月08日
    浏览(43)
  • WPF 如何实现事件绑定 (MVVM)

    首先说到绑定,一般是在WPF 中常见的,因为WPF中有一个比较好用的框架叫做 MVVM 所以View层的按钮等元件的的动作都是需要和后台ViewModel 中的函数进行绑定的。 如 我们最常见的按钮的command 绑定 这里面的command 是命令,不是事件 如果点击图片,或者按钮抬起来的时候需要触

    2024年02月04日
    浏览(53)
  • Simple WPF:实现一个透明、无边框、鼠标穿透的WPF窗体

    一个自定义WPF窗体的解决方案,借鉴了吕毅老师的WPF制作高性能的透明背景的异形窗口一文,并在此基础上增加了鼠标穿透的功能。可以使得透明窗体的鼠标事件穿透到下层,在下层窗体中响应。这一功能在开发一些截图工具,直播、会议标注工具的时候会有比较多的应用,

    2024年02月09日
    浏览(92)
  • WPF 使用MVVM框架创建一个项目

    步骤如下: 1、打开Visual Studio 2017(或其他版本),选择新建项目 2、选择WPF应用(.Net Framework),同时给项目命名,并选择项目存放路径,最后点击确定 3、右键点击解决方案名称,点击“管理NuGet程序包”,点击浏览,在输入框中输入mvvmlight,点击MvvmLight进行安装,安装过程

    2024年02月05日
    浏览(65)
  • 使用MVVM Toolkit简化WPF开发

    最近. NET 8 的 WPF 推出了 WPF File Dialog改进,这样无需再引用 Win32 命名空间就可以实现文件夹的选择与存储了,算是一个很方便的改进了。顺手写了一个小的 WPF 程序,在使用 Model-View-ViewModel(MVVM) 模式的时候,我不想使用 Prism 等重量级的框架,找了一个轻量级的 MVVM Community T

    2024年02月05日
    浏览(61)
  • WPF使用Prism新开窗体regionManager处理

    如果我们需要使用prism弹出一个新的提示窗体可以这样写 但是这样写新窗体注入的regionManager还是原来父窗体的regionManager对象。利用这个对象进行视图注入也可以操作,但是会导致一些奇怪的问题,比如在regionManager.Regions里找不到新加的Region。 此处新窗体的构造函数需要做如

    2024年02月12日
    浏览(39)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包