赞
踩
目录
1.话框对应的ViewModel继承接口:IDiaLogAware
2.注册:RegisterDialog
3.控制弹窗服务API接口:IDialogService
4.传参对象:DialogParameters
5.接收参数:IDialogParameters
6.接收用到的回调:callback
7.接收窗体返回结果:dialogParameters
方式1:直接绑定事件;
方式2:通过binding事件绑定command;
传统的打开窗体最大的问题:
方式一:视图和业务逻辑耦合性太强;
方式二:虽然已经把业务逻辑从XXX.xaml.cs分离到ViewModel中,一定程序上解决了视图和业务逻辑耦合性强的问题,但ViewModel中不建议和窗体实体产生耦合。
1.新建弹窗:
用用户控件的形式创建;
2.注册弹框:
在App.xaml.cs中RegisterTypes方法中注册
protected override void RegisterTypes(IContainerRegistry containerRegistry) { // 弹窗服务的条件: // 1. 创建的用户控件必须注册成一个弹窗(对话框) // 2. 一个对话框对应的ViewModel必须实现IDialogAware接口 containerRegistry.RegisterDialog<PageB, PageBViewModel>(); }3.对话框对应的ViewModel继承IDiaLogAware接口,并实现接口方法
//是否能关闭对话框 public bool CanCloseDialog() { return true; } //在关闭的时候执行的事件 Parameter参数 public void OnDialogClosed() { } //在窗体打开的时候执行 // IDialogParameters主要负责 接收传递的参数 public void OnDialogOpened(IDialogParameters parameters) { }4.调用弹窗(IDialogService)
3.1 注入接口IDialogService
类似于Prism区域设置,同样是使用接口,只不过接口改为 IDialogService--对话服务,同样的将接口注入到构造函数中,目的是为操作 弹框服务 提供的API
private readonly IDialogService dialogService; // 需要在ViewModel构造函数中注入Prism弹窗服务,目的是操作弹窗服务提供的API. // IDialogService接口,提供弹窗服务的功能。 public MainViewModel(IDialogService dialogService) { OpenCommand2 = new DelegateCommand<string>(Open2);//Delegatecommand this.dialogService = dialogService; }3.2 在构造函数中通过 IDialogService的Api ShowDialog调用弹窗
public void Open2(string obj) { this._dialogService.ShowDialog(obj); }
3. Prism 的弹窗传参
重点:使用对象DialogParameters传递参数,IDialogParameters负责接收传递的参数,即可向弹窗传参,弹窗关闭时,也可回传参数。
(说白了就是打开弹框时,有参数传进来;关闭时,有参数传出);而在调动弹框的过程中继承接口IDiaLogAware所对应的实现方法中就有对应的打开,关闭事件;
所以需要考略的就是如何传参?
1.向弹窗传参
1.1 设置参数 :在哪设置?如何传递?
既然是向弹窗传参,所以参数自然是从主窗体传参过去的 :DialogParameters
public void Open2(string obj) { //打开弹窗之前,可以向弹窗传递参数 //DialogParameters 通过它来传参 DialogParameters dialogParameters = new DialogParameters(); this._dialogService.ShowDialog(obj); dialogParameters.Add("Title", "我是弹窗标题"); dialogParameters.Add("Content", "我是弹窗内容"); }1.2 在窗体打开事件中接收参数 在哪接收?如何接收?
1.1中参数已经设置好,第二步就是接收主窗体传递的参数;
至于为什么它能接收到参数,因为此方法的参数是接口IDialogParameters,与传参时用的相对应,因此可以接收到
public void OnDialogOpened(IDialogParameters parameters) { //先判断parameters中是否有该参数 if (parameters.ContainsKey("Title")) { //保存一下 Title = parameters.GetValue<string>("Title"); } if (parameters.ContainsKey("Content")) { Content = parameters.GetValue<string>("Content"); } } private string content{get;set;} public string Content { get { return content; } set { content = value; } } private string title; public string Title { get { return title; } set { title = value; } }效果图:视图绑定就不介绍了
2. 窗体关闭,回传参数
2.1 如同字面意思:参数由弹出窗体传递,主窗体接收;而传递参数也自然是在窗体关闭事件中进行参数设置; 在哪设置?如何传递?
因为是回传,所以要用到 RequestClose.Invoke
public void OnDialogClosed() { // 弹窗关闭时,也可以向来源窗口传递参数。 // 通过DialogResult()传递 DialogParameters parameters = new DialogParameters(); parameters.Add("Name", "张三"); parameters.Add("Age", 20); RequestClose?.Invoke(new DialogResult(ButtonResult.OK, parameters)); }2.2 通过回调来接收关闭时所传的参数 在哪接收?如何接收?
在打开弹窗的ShowDialog中接收,用 callback来回调接收(callback有传参方法对应的接口);其中dialogParameters是接收窗体返回的结果
// 打开弹窗 this.dialogService.ShowDialog(obj, dialogParameters, (callback) => { // a. 回调函数中可以拿到弹窗返回的结果。 // b. 回调函数中可以拿弹窗传递回来的参数。 // MessageBox.Show(callback.Result.ToString()); if (callback.Result == ButtonResult.OK) { string name = string.Empty; //回调中对应传参方法的接口 Parameters if (callback.Parameters.ContainsKey("Name")) { //获取接口中的参数 name = callback.Parameters.GetValue<string>("Name"); } int age = 0; if (callback.Parameters.ContainsKey("Age")) { age = callback.Parameters.GetValue<int>("Age"); } MessageBox.Show($"点击了确定按钮!!!接收到的参数:Name:{name},Age:{age}"); } else { MessageBox.Show("点击了取消按钮!!!"); } });
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。