Xamarin.Forms MessageBox 在VM中实现模态对话框

本文介绍了如何在Xamarin.Forms项目中,遵循MVVM模式时,在ViewModel层调用原生的DisplayAlert对话框,通过中转在Page中实现方法并将其集成到自定义BaseViewModel中。
摘要由CSDN通过智能技术生成

Xamarin.Forms  中有着原生的对话框,DisplayAlert,但发现只能在View或者Page界面下才能使用,但用MVVM模式的话,业务代码都在VM中处理了,所以我做了一下中转,也就实现了在VM中调用对话框的调用了。

首先在Page中实现以下两个方法:

 /// <summary>
 /// 弹出单按钮对话框 永远返回true
 /// </summary>
 /// <param name="title"></param>
 /// <param name="message"></param>
 /// <returns></returns>
 public async Task Popup(string message = "", string title = "提示", string comfirm = "确认")
 {
     await DisplayAlert(title, message, comfirm);
 }

 /// <summary>
 /// 弹出两个按钮的对话框
 /// </summary>
 /// <param name="title"></param>
 /// <param name="message"></param>
 /// <returns></returns>
 public async Task<bool> Popup2(string message = "", string title = "提示", string comfirm = "确认", string cancel = "取消")
 {
     var result = await DisplayAlert(title, message, comfirm, cancel);
     return result;
 }

在与界面绑定的ViewModel中实现以下方法:

因为有用到自己设计的BaseViewModel,才有UIElement这个对象,可以看看我另外一篇介绍BaseViewModel的文章,或者在VM的构造函数中把UI对象传入进来也行。

   private static bool isPopup = false;
   /// <summary>
   /// 弹出单按钮对话框 永远返回true
   /// </summary>
   /// <param name="title"></param>
   /// <param name="message"></param>
   /// <returns></returns>
   public async Task<bool> Popup(string message = "", string title = "提示", string comfirm = "确认")
   {
       if (isPopup)
           return true;
       isPopup = true;
       bool res = true;
       LogOperate.ClickLog(string.Format("弹窗(未点击)-{0}", message));
       await ((MainPage)UIElement).Popup(message, title, comfirm);
       LogOperate.ClickLog(string.Format("弹窗-{0}-{1}", comfirm, message));
       isPopup = false;
       return res;
   }

   /// <summary>
   /// 
   /// </summary>
   /// <param name="title"></param>
   /// <param name="message"></param>
   /// <returns></returns>
   public async Task<bool> Popup2(string message = "", string title = "提示", string comfirm = "确认", string cancel = "取消")
   {
       bool res = true;
       LogOperate.ClickLog(string.Format("弹窗(未点击)-{0}", message));
       res = await ((MainPage)UIElement).Popup2(message, title, comfirm, cancel); ;
       LogOperate.ClickLog(string.Format("弹窗-{0}-{1}", res ? comfirm : cancel, message));
       return res;
   }

最后,就可以在VM中调用对话框的方法啦;

例如:

 var res =await VM_MainPage.Instance.Popup2($"是否删除Bom明细中的物料[{mCode}]?");
 if(res)
 {
 }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rotion_深

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值