主要是通过一个WindowManager管理类,在window后台代码中通过WindowManager注册需要弹出的窗体类型,在ViewModel通过WindowManager的Show方法,显示出来。

WindowManager代码如下:

 public static class WindowManager
{
private static Hashtable _RegisterWindow = new Hashtable(); public static void Regiter<T>(string key)
{
_RegisterWindow.Add(key, typeof(T));
}
public static void Regiter(string key, Type t)
{
if (!_RegisterWindow.ContainsKey(key))
_RegisterWindow.Add(key, t);
} public static void Remove(string key)
{
if (_RegisterWindow.ContainsKey(key))
_RegisterWindow.Remove(key);
} public static void ShowDialog(string key, object VM)
{
if (!_RegisterWindow.ContainsKey(key))
{
throw (new Exception("没有注册此键!"));
} var win = (Window)Activator.CreateInstance((Type)_RegisterWindow[key]);
win.DataContext = VM;
win.ShowDialog();
} }

做一个扩展方法,将子窗体注册方法扩展到Window类型的对象上。

   public static class WindowExt
{
public static void Register(this Window win, string key)
{
WindowManager.Regiter(key, win.GetType());
} public static void Register(this Window win,string key,Type t)
{
WindowManager.Regiter(key,t);
} public static void Register<T>(this Window win, string key)
{
WindowManager.Regiter<T>(key);
}
}

添加一个ViewModelBase,并在类中添加ShowDialog方法,这样所有继承的ViewModel都有这个方法

    public class ViewModelBase
{
public void ShowDialog(string key,object vm)
{
WindowManager.ShowDialog(key,vm);
} public void ShowMessage(string mes,string title="",MessageBoxButton buttons= MessageBoxButton.OK)
{
MessageBox.Show(mes,title,buttons);
}
}

添加一个窗体,并注册子窗体, this.Register<Window1>("Window1");

 public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.DataContext = new MainWindowViewModel();
this.Register<Window1>("Window1");
}
}

添加ViewModel,继承自ViewModelBase,并在对应的命令中弹出子窗体Window1

    public class MainWindowViewModel:ViewModelBase
{
public MainWindowViewModel()
{
BtnCommand = new DelegateCommand(ExecuteBtn);
} public DelegateCommand BtnCommand { get; set; } private void ExecuteBtn()
{
ShowDialog("Window1",this);
} }

这样子窗体就弹出来了。

WPF 介绍一种在MVVM模式下弹出子窗体的方式的更多相关文章

  1. WPF 在MVVM模式下弹出子窗体的方式

    主要是通过一个WindowManager管理类,在window后台代码中通过WindowManager注册需要弹出的窗体类型,在ViewModel通过WindowManager的Show方法,显示出来 ...

  2. MVVM模式下弹出窗体

    原地址:http://www.cnblogs.com/yk250/p/5773425.html 在mvvm模式下弹出窗体,有使用接口模式传入参数new一个对象的,还有的是继承于一个window,然后在 ...

  3. WPF 利用子线程弹出子窗体的研究

    一般来说子线程都是用来处理数据的,主窗体用来实现展现,但是有些时候我们希望子窗体实现等待效果,遮挡主窗体并使主窗体逻辑正常进行,这个业务需求虽然不多,但是正好我们用到了,于是我打算把研究成果写在这了. ...

  4. WPF TriggerAction弹出子窗体 TargetedTrigger、TargetedTriggerAction用法

    namespace TriggerAction { public class OpenWindowAction : TriggerAction<DependencyObject> { pu ...

  5. wpf mvvm模式下CommandParameter传递多参

    原文:wpf mvvm模式下CommandParameter传递多参 CommandParameter一般只允许设置一次,所以如果要传递多参数,就要稍微处理一下.我暂时还没找到更好的方案,下面介绍的这 ...

  6. WPF中在MVVM模式下,后台绑定ListCollectionView事件触发问题

    问题:WPF中MVVM模式下 ListView绑定ListCollectionView时,CurrentChanged无法触发 解决方案: 初期方案:利用ListView的SelectionChang ...

  7. WPF实战案例-MVVM模式下在Xaml中弹出窗体

    相信很多学习和开发wpf项目的同学都了解过mvvm模式,同样,在mvvm模式下会有一个不可忽视的问题,就是怎么在xaml中弹出窗体,而不破坏MVVM本身的结构. 关于弹出窗体的方式还是很多的,本文先讲 ...

  8. MVVM模式下WPF动态绑定展示图片

    MVVM模式下WPF动态展示图片,界面选择图标,复制到项目中固定目录下面,保存到数据库的是相对路径,再次读取的时候是根据数据库的相对路径去获取项目中绝对路径的图片展示. 首先在ViewModel中 / ...

  9. WPF MVVM模式下ComboBox级联效果 选择第一项

    MVVM模式下做的省市区的级联效果.通过改变ComboBox执行命令改变市,区. 解决主要问题就是默认选中第一项 1.首先要定义一个属性,继承自INotifyPropertyChanged接口.我这里 ...

随机推荐

  1. SecureCRT乱码解决

    本文不涉及编码,只说明ssh问题产生的乱码 如果终端中输出以下字符,就会出现乱码 echo -e '\xe' 还有 ctrl+v,ctrl+n也能产生乱码 恢复方法 echo -e '\xf'

  2. JWT设计实现

    一.JWT基于token的认证流程: 二.JWT SDK的选取: https://jwt.io/ 三.编写JWT Helper: 1.获取token 设置密钥,规定算法,设置过期时间,设置发行方,生命 ...

  3. 【RabbitMQ】 Java简单的实现RabbitMQ

    准备工作 1.安装RabbitMQ,参考[RabbitMQ] RabbitMQ安装 2.新建Java项目,引入RabbitMQ的Maven依赖 <dependency> <group ...

  4. 如何在Android平台上使用USB Audio设备

    http://blog.csdn.net/kevinx_xu/article/details/12951131 需求:USB Headset插上去后,声音要从本地CODEC切换到USB Headset ...

  5. svn log — 显示提交日志信息

    http://www.cnblogs.com/eoiioe/archive/2009/01/06/1370580.html 概要svn log [PATH]svn log URL [PATH...]描 ...

  6. python学习 day18 (3月25日)---( 面向对象浅析)

    面向对象思想: 字典表示对象: 不是太好 因为 变量 得一个个的赋值改值 {'name':'alex','blood':20,'attack':1,'sex':'不'} {'name':'太亮','b ...

  7. 2018.10.29 bzoj1023: [SHOI2008]cactus仙人掌图(仙人掌+单调队列优化dp)

    传送门 求仙人掌的直径. 感觉不是很难. 分点在环上面和不在环上分类讨论. 不在环上直接树形dpdpdp. 然后如果在环上讨论一波. 首先对环的祖先有贡献的只有环上dfsdfsdfs序最小的点. 对答 ...

  8. Interrouter Signals

    summary of traditional NoC interrouter signals summary of SMART interrouter signals flit_valid and f ...

  9. python的6种基本数据类型--字典

    python的6种基本数据类型--字典   字典 字典的定义与特性 字典是Python语言中唯一的映射类型. 定义:{key1:value1,key2:value2} 1.键与值用冒号":& ...

  10. 师弟推荐软件-/mathpix

    将公式扫描为latex:https://mathpix.com/api.html mathtype与latex转换:http://www.mathtype.cn/jiqiao/zhuanhua-gon ...