最近一直在研究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. iOS开发系列—Objective-C之Foundation框架

    概述 我们前面的章节中就一直新建Cocoa Class,那么Cocoa到底是什么,它和我们前面以及后面要讲的内容到底有什么关系呢?Objective-C开发中经常用到NSObject,那么这个对象到底 ...

  2. java中文乱码解决之道(八)-----解决URL中文乱码问题

    我们主要通过两种形式提交向服务器发送请求:URL.表单.而表单形式一般都不会出现乱码问题,乱码问题主要是在URL上面.通过前面几篇博客的介绍我们知道URL向服务器发送请求编码过程实在是实在太混乱了.不 ...

  3. K-均值聚类算法

    K-均值聚类算法 聚类是一种无监督的学习算法,它将相似的数据归纳到同一簇中.K-均值是因为它可以按照k个不同的簇来分类,并且不同的簇中心采用簇中所含的均值计算而成. K-均值算法 算法思想 K-均值是 ...

  4. xamarin UWP自定义圆角按钮

    uwp自带的button本身不支持圆角属性,所以要通过自定义控件实现. 通过设置Button的Background=“{x:Null}”设置为Null使背景为空,再设置Button.Content中的 ...

  5. php后台增加删除修改跳转页面

    第一步 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3. ...

  6. 集群下session共享问题的解决方案.

    这一篇博客来讲解下babasport这个项目中使用的Login功能, 当然这里说的只是其中的一些简单的部分, 记录在此 方便以后查阅. 一: 去登录页面首先我们登录需要注意的事项是, 当用户点击登录按 ...

  7. iOS--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook等系统服务开发汇总

    iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用系统应用.使用系统服务: ...

  8. JS中script词法分析

    核心:JS中的script是分段执行的. <script> var i = 10; </script> <script> alert(i); </script ...

  9. ECMAScript

    在Javascript中,万物皆对象,但对象也有区别,大致可以分为两类,即:普通对象(Object)和函数对象(Function). 一般而言,通过new Function产生的对象是函数对象,其他对 ...

  10. OpenCASCADE PCurve of Topological Face

    OpenCASCADE PCurve of Topological Face eryar@163.com Abstract. OpenCASCADE provides a class BRepBuil ...