最近在做 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 支持子窗体显示、关闭、传参的更多相关文章

  1. 子窗体显示在任务栏,且子窗体中又有弹窗(CreateParams修改三个风格参数)

    子窗体显示在任务栏时, procedure Tfrm_SendSmartMsg.CreateParams(var Params: TCreateParams);begin  inherited;  P ...

  2. 【vue】父向子组件传参、子组件向父传参

    1.父向子组件传参 App.vue为父,引入componetA组件之后,则可以在App.vue中使用标签(注意驼峰写法要改成componet-a写法,因为html对大小写不敏感,componenta与 ...

  3. c#如何将子窗体显示到父窗体的容器(panel)控件中

    如何将一个窗体显示到一个容器控件中,刚开始想的比较简单,用窗体容器控件添加一般控件的方法,试了一试,代码如下: Form2 frm = new Form2(); this.panel1.Control ...

  4. vue.js 1中父组件跳到子组件中并传参让子组件显示不同的内容

    父组件中的点击跳转: <ul class="insurance-entry clearfloat"> <li v-link="{name:'produc ...

  5. LigerUI子父窗口之间传参问题

    在父窗口自定义一个参数,该参数为一个方法,然后在子窗口使用 var dialog = frameElement.dialog; //调用页面的dialog对象(ligerui对象)该对象,取得父窗口定 ...

  6. ASP.NET WebAPI RC 竟然不支持最常用的json传参

    壮士断腕(WCF Web API),为的是 ASP.NET Web API 的横空出世,再加上它的开放(开源),于是对之产生了一点点痴情,并写下了HttpClient + ASP.NET Web AP ...

  7. WPF制作子窗体的弹出动画效果

    创建一个WPF应用程序WpfApplication1,新建个窗体DialogWin <Windowx:Class="WpfApplication1.DialogWin" xm ...

  8. c# winform 窗体之间的传参

    说起winform程序中窗体之间的参数互传,大家找度娘会找到很多方法: 1.在窗体类中创建全局变量,类型为公开.静态的: 2.在窗体类中定义狗仔函数: 3.通过实践来船体参数: 这三种思路完全来自于霖 ...

  9. WPF 子窗体关闭时显示父窗体

    这个问题纠结了两天,今天在一个朋友的帮助下,解决了,其实很简单,但是可能作为新手,接触WPF时间还是短,因此作为一个问题困扰了我. 父窗体部分代码 private void EditInformati ...

随机推荐

  1. sqlserver 批量删除存储过程和批量修改存储过程的语句

    sqlserver 批量删除存储过程和批量修改存储过程的语句- sqlserver 批量删除存储过程和批量修改存储过程的语句,需要的朋友可以参考下. - 修改: 复制代码 代码如下: declare ...

  2. WEB 安全之 SQL注入 < 二 > 暴库

    SQL注入是一个比较"古老"的话题,虽然现在存在这种漏洞的站点比较少了,我们还是有必要了解一下它的危害,及其常用的手段,知己知彼方能百战不殆.进攻与防守相当于矛和盾的关系,我们如果 ...

  3. 慕课网-安卓工程师初养成-1-1 Java简介

    来源 http://www.imooc.com/video/1430 主要内容 Java平台应用 核心概念:JVM,JDK,JRE 搭建Java开发环境 使用工具开发安卓程序 经验技巧分享 Java历 ...

  4. Entity Framework Lambda 实现多列Group by,并汇总求和

    var result = DataSummaryRepository.FindBy(x => x.UserID == argMemberNo && x.SummaryDate & ...

  5. java(POI):基于模版的Excel导出功能,局部列写保护总结

    需求描述: 1.导出的Excel中部分列包含有下拉列表,并没有尝试过用代码实现这种功能,个人感觉比较棘手,故采用了模版的形式,直接导出数据到已经创建好的Excel模版中 2.Excel的第一列需要写保 ...

  6. 【Hibernate 6】常用的hql语句以及N+1问题

    HQL:Hibernate Query Language,是Hibernate框架中的查询语言,十分接近于SQL语言!以下介绍一些常用的Hql语句: 一.测试类 Classes类: <span ...

  7. CSS3文字描边 CSS3字体外部描边

    给需要实现文字描边的元素添加如下CSS3的属性 text-shadow:#000 1px 0 0,#000 0 1px 0,#000 -1px 0 0,#000 0 -1px 0; -webkit-t ...

  8. global.autoindex dede:global.itemindex 获取子栏目自动排序序号

    {dede:channel  row='6' typeid=7 }                  [field:global.autoindex runphp='yes']             ...

  9. SQL Server T-SQL高级查询(转)

    高级查询在数据库中用得是最频繁的,也是应用最广泛的.   Ø 基本常用查询   --select select * from student; --all 查询所有 select all sex fr ...

  10. oracle split

    select * from table(fun_strsplit('1,2,3,4,5')); 1.创建一个类型 ) 2.创建函数 CREATE OR REPLACE FUNCTION Fun_Str ...