最近一直在研究Xmarin.forms,碰到了一个棘手的问题,就是在MVVM的情况下如何在ViewModel中去使用DisplayActionSheet,然而我使用的是XAML模式,也就是说,只有在后台页面中,才可以使用Page独有的DisplayActionSheet。找了一下午资料,网上说,可以给彼此架一座桥梁,使ViewModel和Page连接起来。

首先,你需要在你的Page页面中,使用MessagingCenter来写一个DisplayActionSheet的方法

  MessagingCenter.Subscribe<BaseViewModel, DisplayActionSheetModel>(this, "DisplayActionSheet", async (sender, values) =>
{
string result = String.Empty;
result = await DisplayActionSheet(values.Title, values.ButtonOne, values.ButtonTwo, values.DisplayValues);
if (values.OnCompleted != null)
{
values.OnCompleted(result);
}
});
BaseViewModel这个地方当然你写自己所属的ViewModel或者Application都可以
在BaseViewModel中我们需要配置下桥梁从而让我们的ViewModel连接上Page
 public async Task DisplayActionSheet(DisplayActionSheetModel actionSheetModel)
{
MessagingCenter.Send<BaseViewModel, DisplayActionSheetModel>(this, "DisplayActionSheet", actionSheetModel);
}

那么我们再ViewModel中就可以这样使用它了

 var actionSheetModel = new DisplayActionSheetModel();
actionSheetModel.Title = "Are you Sure?";
actionSheetModel.ButtonOne = "Cancel";
actionSheetModel.DisplayValues = new string[]
{
"Yes","No","I donw't know","I'm sure!","..."
};
actionSheetModel.OnCompleted += (accept) =>
{
DisData = accept;
};
await DisplayActionSheet(actionSheetModel);

使用一个构造类就可以轻松的把数据传递给Page了,那么问题来了

我们现在可以将DisplayActionSheet中所需要的属性使用ViewModel传递给Page,那么,我们究竟该如何把Page中的数据再拿回来给ViewModel?

想必大家也看到了OnCompleted,那么大家可以看一下我的Model

 public class DisplayActionSheetModel
{
public string Title { get; set; }
public string ButtonOne { get; set; }
public string ButtonTwo { get; set; }
public string[] DisplayValues { get; set; }
public Action<string> OnCompleted { get; set; }
}

这样在你选择之后它便会把你的所选择的东西赋值给Action<string>,然后我们使用

OnCompleted += (accept) =>
{
DisData = accept;
};
这样的方式把选择的值赋值给DisData接下来看一下效果图

当然,我是点击的第二个按钮之后才会弹出我所选择的I'm sure

 private async Task DisTest()
{
await DisplayAlert("Test", DisData);
}

那么这样就会存在一个问题,如果我在选择之后想要对所选择的值进行相应的操作怎么办?

我试了很多方法,像Task.WaitAll();什么的,唯一会起到作用的是await Task.Delay(1000);让接下来的操作等待1秒钟,如果我选择的快了,没有问题,可是如果我选择的慢了,依旧不行,治标不治本,所以,找了一下午资料也没有找到合适的解决办法,请问各位吧友,你们有好的解决办法吗?

如果有的话请帮小弟指点一下迷津,小弟感激不尽。。。

关于xamarin.forms在MVVM情况下如何DisplayActionSheet的更多相关文章

  1. 3、Xamarin Forms 调整安卓TabbedPage 下置

    降低学习成本是每个.NET传教士义务与责任. 建立生态,保护生态,见者有份.   教程晦涩难懂是我的错误. 对于默认的TabbedPage 上面进行页面切换 上面是安卓默认的情况 对我们大部分人来说都 ...

  2. 走进 Visual Studio Mobile Center for Xamarin.Forms

    前几篇分别介绍了 Xamarin.Forms 的 MVVM 的 Prism,UITest,Nuint Test,那这样算下来,代码部分基本结构都有了(逻辑就先忽略吧) 那接下来就应该是自动 Build ...

  3. Xamarin.Forms 开发资源集合(复制)

    复制:https://www.cnblogs.com/mschen/p/10199997.html 收集整理了下 Xamarin.Forms 的学习参考资料,分享给大家,稍后会不断补充: UI样式 S ...

  4. Xamarin.Forms 开发资源集合

    收集整理了下 Xamarin.Forms 的学习参考资料,分享给大家,稍后会不断补充: UI样式 Snppts: Xamarin Forms UI Snippets. Prebuilt Templat ...

  5. 菜鸟的Xamarin.Forms前行之路——按钮的按下抬起事件的监控(可扩展至其他事件)

    提问:监控按钮的点击事件,可以通过按钮的Click事件,或者Command绑定,那么如何监控按钮的按下与抬起,或者移动,长按,双击等事件? 解决方法:各个平台自定义渲染依赖注入. 共享项目PCL: 1 ...

  6. 菜鸟的Xamarin.Forms前行之路——windows下VS运行ios模拟器调试

    在Xamarin.Forms项目中,运行安卓模拟器是很方便的,但是想要运行IOS模拟器,相对而言是困难一点. 在参考一些资料后,发现很多是与Xamarin.studio有关的方法,尝试了许久没有成功. ...

  7. 老司机学新平台 - Xamarin Forms开发框架二探 (Prism vs MvvmCross)

    在上一篇Xamarin开发环境及开发框架初探中,曾简单提到MvvmCross这个Xamarin下的开发框架.最近又评估了一些别的,发现老牌Mvvm框架Prism现在也支持Xamarin Forms了, ...

  8. 演练:使用Xamarin.Forms开发产品介绍性质的应用(VB版)

    概述 Xamarin这个使用mono和.net core的跨平台开发框架这几年在不断发展.被微软收购后的Xamarin为个人开发者提供了免费版的Xamarin for Visual Studio,吸引 ...

  9. 使用MvvmCross框架实现Xamarin.Forms的汉堡菜单布局

    注:本文是英文写的,偷懒自动翻译过来了,原文地址:Implementing MasterDetail layout in Xamarin.Forms by MvvmCross 欢迎大家关注我的公众号: ...

随机推荐

  1. 《代码的未来》读书笔记:内存管理与GC那点事儿

    一.内存是有限的 近年来,我们的电脑内存都有好几个GB,也许你的电脑是4G,他的电脑是8G,公司服务器内存是32G或者64G.但是,无论内存容量有多大,总归不是无限的.实际上,随着内存容量的增加,软件 ...

  2. log4j.xml的实用例子

    大多数讲log4j配置的教程用的都是log4j.properties文件,我觉得xml或许更好一点,在这里我提供一个我已经用于生产环境的log4j.xml的例子,先上代码,然后再解释: <?xm ...

  3. Windows Azure Storage (20) 使用Azure File实现共享文件夹

    <Windows Azure Platform 系列文章目录> Update 2016-4-14.在Azure VM配置FTP和IIS,请参考: http://blogs.iis.net/ ...

  4. WCF basicHttpBinding之Message Security Mode

    原创地址:http://www.cnblogs.com/jfzhu/p/4067873.html 转载请注明出处 前面的文章<WCF Security基本概念>介绍了WCF的securit ...

  5. C语言 · 十六进制转十进制

    问题描述 从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出. 注:十六进制数中的10~15分别用大写的英文字母A.B.C.D.E.F表示. 样例输入 FFFF 样例输出 6 ...

  6. Mac下安装与配置Go语言开发环境

    1.官网下载安装包(需FQ) https://storage.googleapis.com/golang/go1.7.darwin-amd64.pkg 2.配置Go环境变量GOPATH和GOBIN ( ...

  7. Atitit 索引技术--位图索引

    Atitit 索引技术--位图索引 索引在数据结构上可以分为三种B树索引.位图索引和散列索引 存储原理 编辑 位图索引对数据表的列的每一个键值分别存储为一个位图,Oracle对于不同的版本,不同的操作 ...

  8. 浅谈JavaScript的New关键字

    原型和闭包算是JavaScript中最常见,最难以理解,最容易被当做问题的两个部分,当然还有它们的延伸,如作用域链,继承等等吧,我最近也是各种看,各种翻,记录点自己的心得,写写总会让自己的理解更深一些 ...

  9. VMware Tools安装小结

    背景介绍:在VMware上装完ArchLinux后,窗口太小,操作不方便.查询后得知VMware Tools没有自动安装,需要手动安装. 官方安装说明:在 Linux 虚拟机中手动安装或升级 VMwa ...

  10. 【开源】OSharp框架解说系列(2.2):EasyUI复杂布局及数据操作

    OSharp是什么? OSharp是个快速开发框架,但不是一个大而全的包罗万象的框架,严格的说,OSharp中什么都没有实现.与其他大而全的框架最大的不同点,就是OSharp只做抽象封装,不做实现.依 ...