.NET MAUI中如何通过Mopups弹窗返回值?
使用Mopups实现弹窗关闭后返回值
要实现自定义弹窗关闭后返回值,你可以参考以下两种方式来实现:
方式一:通过ViewModel属性传递结果
1. 自定义弹窗ViewModel
在弹窗的ViewModel中添加结果存储属性,以及触发弹窗关闭的命令:
public class ConfirmationPopupViewModel : ObservableObject { private readonly IPopupNavigation _popupNavigation; public ICommand ConfirmCommand { get; } public ICommand CancelCommand { get; } // 用于存储弹窗返回结果 public bool? Result { get; private set; } public ConfirmationPopupViewModel(IPopupNavigation popupNavigation) { _popupNavigation = popupNavigation; ConfirmCommand = new Command(() => ClosePopup(true)); CancelCommand = new Command(() => ClosePopup(false)); } private void ClosePopup(bool isConfirmed) { Result = isConfirmed; _popupNavigation.PopAsync(); } }
2. 弹窗页面绑定命令
在弹窗的XAML中,将确认、取消按钮与ViewModel的命令绑定:
<mopups:PopupPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:mopups="clr-namespace:Mopups.Pages;assembly=Mopups" x:Class="YourAppNamespace.ConfirmationPopup" BindingContext="{Binding Source={StaticResource ConfirmationPopupViewModel}}"> <VerticalStackLayout Padding="20" Spacing="15"> <Label Text="Do you really want to delete this card?" /> <HorizontalStackLayout Spacing="10"> <Button Text="Cancel" Command="{Binding CancelCommand}" /> <Button Text="OK" Command="{Binding ConfirmCommand}" /> </HorizontalStackLayout> </VerticalStackLayout> </mopups:PopupPage>
3. 调用弹窗并获取结果
在需要弹窗的地方,实例化弹窗和ViewModel,等待弹窗关闭后直接读取ViewModel的结果属性:
var viewModel = new ConfirmationPopupViewModel(popupService); var confirmationPopup = new ConfirmationPopup { BindingContext = viewModel }; // 显示弹窗,等待关闭 await popupService.PushAsync(confirmationPopup); // 获取返回结果 bool? isConfirmed = viewModel.Result; if (isConfirmed == true) { // 执行删除逻辑 } else { // 取消操作 }
方式二:通过事件回调传递结果
适合更复杂的场景,通过ViewModel定义事件,弹窗关闭时触发事件传递结果:
1. 改造ViewModel添加事件
public class ConfirmationPopupViewModel : ObservableObject { private readonly IPopupNavigation _popupNavigation; public ICommand ConfirmCommand { get; } public ICommand CancelCommand { get; } // 定义弹窗关闭事件 public event Action<bool>? OnPopupClosed; public ConfirmationPopupViewModel(IPopupNavigation popupNavigation) { _popupNavigation = popupNavigation; ConfirmCommand = new Command(() => ClosePopup(true)); CancelCommand = new Command(() => ClosePopup(false)); } private void ClosePopup(bool isConfirmed) { OnPopupClosed?.Invoke(isConfirmed); _popupNavigation.PopAsync(); } }
2. 调用方订阅事件获取结果
var viewModel = new ConfirmationPopupViewModel(popupService); // 订阅事件获取结果 viewModel.OnPopupClosed += (isConfirmed) => { if (isConfirmed) { // 处理确认逻辑 } }; var confirmationPopup = new ConfirmationPopup { BindingContext = viewModel }; await popupService.PushAsync(confirmationPopup);
内容的提问来源于stack exchange,提问作者Tanaka Mawere
相关产品推荐
相关产品推荐

