最近一直在研究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. 多线程中的锁系统(二)-volatile、Interlocked、ReaderWriterLockSlim

    上章主要讲排他锁的直接使用方式.但实际当中全部都用锁又太浪费了,或者排他锁粒度太大了,本篇主要介绍下升级锁和原子操作. 阅读目录 volatile Interlocked ReaderWriterLo ...

  2. 如何在没有域的环境中搭建AlwaysOn(二)

    对DBA而言,不需要域就可以搭建SQL Server AlwaysOn是Windows Server 2016中最令人兴奋的功能了,它不仅可以降低搭建的成本,而且还减少了部署和运维的工作量. 上篇博客 ...

  3. SQL Server 2012故障转移的looksalive check和is alive check

    什么是looksalive check和is alive check SQL Server故障转移集群是建立在windows集群服务上的一种热备的高可用方案.在集群运行过程中,windows集群服务定 ...

  4. TCP状态

    TCP状态 TCP连接中包含不同的状态,如何通过状态来判断程序问题尤为重要. 三次握手 图中的connection部分为三次握手. 四次握手 图中的close部分为四次握手. CLOSE_WAIT 服 ...

  5. SharpFileDB - a file database for small apps

    SharpFileDB - a file database for small apps 本文中文版在此处. I'm not an expert of database. Please feel fr ...

  6. Android 6.0 权限申请辅助 ----PermissionsHelper

    Android 6.0 权限申请辅助 ----PermissionsHelper 项目地址:https://github.com/didikee/PermissionsHelper Android 的 ...

  7. 生成lua的静态库.动态库.lua.exe和luac.exe

    前些日子准备学习下关于lua coroutine更为强大的功能,然而发现根据lua 5.1.4版本来运行一段代码的话也会导致 "lua: attempt to yield across me ...

  8. 利用Bootstrap快速搭建个人响应式主页(附演示+源码)

    1.前言 我们每个程序员都渴望搭建自己的技术博客平台与他人进行交流分享,但使用别人的博客模板没有创意.做网站后台的开发人员可能了解前端,可是自己写一个不错的前端还是很费事的.幸好我们有Bootstra ...

  9. socket编程

    一.socket地址的数据类型及相关函数 socket API是一层抽象的网络编程接口,适用于各种底层网络协议,如IPv4.IPv6.UNIX Domain Socket.然而各种网络协议的地址格式并 ...

  10. 深入学习jQuery元素过滤

    × 目录 [1]索引过滤 [2]内容过滤 前面的话 过滤是jQuery扩展的一个重要的内容.jQuery选择器中的一个重要部分就是过滤选择器.除了过滤选择器,还有专门的元素过滤的方法.本文将详细介绍j ...