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)
{
}