zoukankan      html  css  js  c++  java
  • 关于xamarin.forms在MVVM情况下如何DisplayActionSheet

    最近一直在研究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秒钟,如果我选择的快了,没有问题,可是如果我选择的慢了,依旧不行,治标不治本,所以,找了一下午资料也没有找到合适的解决办法,请问各位吧友,你们有好的解决办法吗?

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

  • 相关阅读:
    【转】FIddler+Proxifer工具对windows PC客户端进行抓包
    Json提取器(Json Extractor)
    Json断言
    015-Zabbix自动发现和自动注册
    014-Zabbix的自动发现
    013-zabbix trapper方式监控
    012-zabbix主动模式
    011-通过安装percona插件监控MySQL
    010-监控windows主机
    009-通过jmx监控tomcat
  • 原文地址:https://www.cnblogs.com/myblogslh/p/5509724.html
Copyright © 2011-2022 走看看