MvvmCross for WPF 支持子窗体显示、关闭、传参
最近在做 PCL(Portable Class Library)平台的项目,所以发一下自己遇到的问题
MvvmCross 是 PCL 平台的一个 MVVM 框架
地址:https://github.com/MvvmCross/MvvmCross
支持的平台:
- Silverlight for WP7, WP8
 - Mono for Android (or Xamarin.Android)
 - MonoTouch for iOS (or Xamarin.iOS)
 - the WinRT XAML framework for Windows 8 Store apps.
 - WPF
 - Mono for Mac (or Xamarin.Mac)
 
在使用过程中首先遇到了弹出子窗体的问题,需要写一个类继承 MvxWpfViewPresenter
显示子窗体时重写 Present 方法
参考了一个列子:https://gist.github.com/cureos/6053471 ,还有朋友尚仔的大力帮助
关闭子窗体时, 再重写 ChangePresentation 方法就可以了
在WPF项目中加入下边代码就可以了
代码如下:
public class MvxWindowViewPresenter : MvxWpfViewPresenter
{
private readonly ContentControl _contentControl; private FrameworkElement _frameworkElement;
public MvxWindowViewPresenter(ContentControl contentControl)
{
_contentControl = contentControl;
} public override void Present(FrameworkElement frameworkElement)
{
_frameworkElement = frameworkElement;
var window = frameworkElement as Window;
if (window == null)
{
_contentControl.Content = frameworkElement;
}
else
{
window.Owner = _contentControl as Window;
window.ShowDialog();
}
} public override void ChangePresentation(MvxPresentationHint hint)
{
IMvxWpfView view;
var closeHint = hint as MvxClosePresentationHint;
if (closeHint != null
&& (view = _frameworkElement as IMvxWpfView) != null
&& ReferenceEquals(closeHint.ViewModelToClose, view.ViewModel))
{
(_frameworkElement as Window).Close();
} base.ChangePresentation(hint);
}
}
写一个子窗体继承自 IMvxWpfView ,因为会监测这个接口
public class SubWindow: IMvxWpfView
{
private IMvxViewModel _viewModel; public IMvxViewModel ViewModel
{
get { return _viewModel; }
set
{
_viewModel = value;
DataContext = value;
}
} private int myVar; public int MyProperty
{
get { return myVar; }
set { myVar = value; }
} }
显示子窗体:
ShowViewModel<SubViewModel>();
(SubViewModel为要显示的子窗体的ViewModel)
关闭子窗体:
Close(this);
当需要传参时,分为2种
一、从MainViewModel to SubViewModel
 ShowViewModel<SubViewModel>(new { id= Id});
id 为子窗体中接受参数的名称
Id 为主窗体中要传递的参数的名称
同时子窗体中要写一个接收参数的方法
public void Init(int Id)
{
Id= id;
}
这样就把参数从MainViewModel 传到了 SubViewModel
二、从SubViewModel to MainViewModel
这时就需要用到 MvvmCross 框架支持的插件 Plugins 中的 Messager
首先在 Core 项目中的 App.cs 中重写一个方法,把插件注册进来
public override void LoadPlugins(IMvxPluginManager pluginManager)
{
base.LoadPlugins(pluginManager); if (pluginManager == null)
{
return;
} pluginManager.EnsurePluginLoaded<PluginLoader>();
}
其次写一个 Message 继承 MvxMessage
public class XXXMessage : MvxMessage
{
public XXXMessage(object sender, int id)
: base(sender)
{
Id= id;
} public int Id{ get; private set; }
}
再在 MainViewModel 中声明一个字段,并在构造中实例化Messager
 private readonly MvxSubscriptionToken _token;
          public MainViewModel()
          {
              var messenger = Mvx.Resolve<IMvxMessenger>();
              _token = messenger.Subscribe<XXXMessage>(OnXXXMessage);
          }
          private void OnXXXMessage(XXXMessage XXXMessage)
          {
              if (XXXMessage == null)
              {
                  return;
              }
              // TODO
          }
最后在 SubViewModel 中需要回传参数的地方把参数传回来
var messenger = Mvx.Resolve<IMvxMessenger>();
messenger.Publish<XXXMessage>(new XXXMessagethis, id));
如此就可以在MvvmCross 中就可以显示子窗体、关闭子窗体、ViewModel 之间互相传参
Tips:据说 Service 和 Settings 也可以回传参数,有做出来的欢迎发来分享!
MvvmCross for WPF 支持子窗体显示、关闭、传参的更多相关文章
- 子窗体显示在任务栏,且子窗体中又有弹窗(CreateParams修改三个风格参数)
		
子窗体显示在任务栏时, procedure Tfrm_SendSmartMsg.CreateParams(var Params: TCreateParams);begin inherited; P ...
 - 【vue】父向子组件传参、子组件向父传参
		
1.父向子组件传参 App.vue为父,引入componetA组件之后,则可以在App.vue中使用标签(注意驼峰写法要改成componet-a写法,因为html对大小写不敏感,componenta与 ...
 - c#如何将子窗体显示到父窗体的容器(panel)控件中
		
如何将一个窗体显示到一个容器控件中,刚开始想的比较简单,用窗体容器控件添加一般控件的方法,试了一试,代码如下: Form2 frm = new Form2(); this.panel1.Control ...
 - vue.js 1中父组件跳到子组件中并传参让子组件显示不同的内容
		
父组件中的点击跳转: <ul class="insurance-entry clearfloat"> <li v-link="{name:'produc ...
 - LigerUI子父窗口之间传参问题
		
在父窗口自定义一个参数,该参数为一个方法,然后在子窗口使用 var dialog = frameElement.dialog; //调用页面的dialog对象(ligerui对象)该对象,取得父窗口定 ...
 - ASP.NET WebAPI RC 竟然不支持最常用的json传参
		
壮士断腕(WCF Web API),为的是 ASP.NET Web API 的横空出世,再加上它的开放(开源),于是对之产生了一点点痴情,并写下了HttpClient + ASP.NET Web AP ...
 - WPF制作子窗体的弹出动画效果
		
创建一个WPF应用程序WpfApplication1,新建个窗体DialogWin <Windowx:Class="WpfApplication1.DialogWin" xm ...
 - c# winform 窗体之间的传参
		
说起winform程序中窗体之间的参数互传,大家找度娘会找到很多方法: 1.在窗体类中创建全局变量,类型为公开.静态的: 2.在窗体类中定义狗仔函数: 3.通过实践来船体参数: 这三种思路完全来自于霖 ...
 - WPF 子窗体关闭时显示父窗体
		
这个问题纠结了两天,今天在一个朋友的帮助下,解决了,其实很简单,但是可能作为新手,接触WPF时间还是短,因此作为一个问题困扰了我. 父窗体部分代码 private void EditInformati ...
 
随机推荐
- 一张图看Goodle Clean设计架构
			
之前用一张图分析了Google给出的MVP架构,但是在Google给出的所有案例里面除了基本的MVP架构还有其它几种架构,今天就来分析其中的Clean架构.同样的,网上介绍Clean架构的文章很多,我 ...
 - 2014年值得学习的25个PS CS6教程(一)
			
热爱PS的朋友看过来~~~下面跟大家推荐10个高端大气上档次的PS教程(都是英文的哦) 1.为4D电影创建一副3D海报 2.制作3D水果文字 3.肖像图混合数字工艺 4.‘Doctrich – Pos ...
 - android大项目运行中出现问题汇总
			
Android 项目中,特别是当项目文件和规模达到一定的程度后,会引发一些平常不常见的问题. 下面对遇到的一些问题做一个汇总和总结. scenario 1: 在项目中,我们采用了chromimum内核 ...
 - android 自定义组件
			
Google 公司为我们开发Android应用程序提供了丰富的UI组件,有时一个控件无法满足我们的需求,这就要求我们同时使用两个三个或者个更多的控件一起使用.有些常用的组合我就把他写成一个自定的的组件 ...
 - Android控件大全(三)——RecyclerView
			
是时候用RecyclerView来替换ListView和GridView了 好处就不多说了,百度一搜一大把,来介绍下用法 先定义个适配器: public class BottomSheetAdapte ...
 - [Hibernate 1]Hibernate的环境搭建
			
一.Hibernate是什么 直接使用JDBC操作数据库的步骤很繁琐,JDBC操作的是关系型数据库,而我们用JAVA开发程序,则使用面向对象的思想.Hibernate正是在这两种不同的模型之间建立关联 ...
 - 【MySQL】删除大表的讨论【转】
			
转自http://tech.ddvip.com/2013-07/1373269453198566.html 微博上讨论MySQL在删除大表engine=innodb(30G+)时,如何减少MySQL ...
 - 按照  where id in ()排序
			
select * from ibs6_terminal_adv_inf where id in (16,14,15) order by find_in_set(id,'16,14,15')
 - hdu2099
			
注意是两位数,必须输出01,02,03,这种 #include <stdio.h> int main(){ int begin,end; int i; ]; int cnt; int si ...
 - javaSE第十五天
			
第十五天 117 1. 对象数组(掌握) 117 (1)定义: 117 (2)对象数组的内存图解 117 (3)案例: 117 2. 集合(Collection)(掌握) ...