如何从视图模型显示弹出窗口。毛伊岛

Sil*_*oJa 5 c# xamarin maui

我正在使用 Nuget CommunityToolkit.Maui.Views。我的毛伊岛应用程序我也使用 viewModels。现在我想通过 viewmodel 方法显示我的自定义对话框。但

this.ShowPopup(new DialogPopup());
Run Code Online (Sandbox Code Playgroud)

只能在 Page 对象上调用。

我可以将值 Page 分配给 viewModel 中的属性,但我不确定这是实现它的最佳选择:

private readonly MainViewModel _mainViewModel;
public MainPage(MainViewModel vm)
{
    InitializeComponent();
    BindingContext = vm;
    _mainViewModel = vm;
    _mainViewModel.Page = this;
}
Run Code Online (Sandbox Code Playgroud)

并在视图模型中

public Page Page { get; set; }
Run Code Online (Sandbox Code Playgroud)

Page.ShowPopup(new DialogPopup());
Run Code Online (Sandbox Code Playgroud)

ShowPopup 方法如下所示:

public static void ShowPopup<TPopup>(this Page page, TPopup popup) where TPopup : Popup {...}
Run Code Online (Sandbox Code Playgroud)

我应该如何实现它才能在我的视图模型中使用此 ShowPupup 方法?

我正在使用 Net 7.0 和依赖注入来初始化我的对象。

Ger*_*uis 7

本讨论中描述了这样做的一种方法。您基本上可以将弹出窗口的显示包装在服务中。

  1. 创建接口
public interface IPopupService
{
    void ShowPopup(Popup popup);
}
Run Code Online (Sandbox Code Playgroud)
  1. 创建实施
public class PopupService : IPopupService
{
    public void ShowPopup(Popup popup)
    {
        Page page = Application.Current?.MainPage ?? throw new NullReferenceException();
        page.ShowPopup(popup);
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 不要忘记将其注册到您的MauiProgram.cs
services.AddTransient<IPopupService, PopupService> ();
Run Code Online (Sandbox Code Playgroud)
  1. 将服务注入到您的视图模型中并使用它
    public MainViewModel(IPopupService popupService)
    {
        this.popupService = popupService;
    }

    // and then somewhere (probably in a Command)...
    popupService.ShowPopup(popup);  
Run Code Online (Sandbox Code Playgroud)

我们还致力于在工具包本身中添加类似的内容,以便您不必在项目中自己编写这些内容。您可以在此处跟踪进度。