在 .NET MAUI 中,您可以将数据传输对象作为查询字符串参数从一个视图传递到另一个视图吗?

Dav*_*ugh 2 c# query-string maui

我已经完成了 .NET MAUI“创建 .NET MAUI 应用程序”启动教程。我对教程进行了一些修改,以使用 sqlite 数据库而不是 CollectionView 中每一行的文件。当他们在集合视图中编辑一行时,他们将该行的 DTO id 传递给新视图:

await Shell.Current.GoToAsync($"{nameof(NotePage)}?{nameof(NotePage.ItemId)}={SelectedNote.ID}");
Run Code Online (Sandbox Code Playgroud)

新视图使用以下注释加载 ItemID:

[QueryProperty(nameof(ItemId), nameof(ItemId))]
Run Code Online (Sandbox Code Playgroud)

然后,我使用该 ItemId 并对数据库进行另一次调用以返回 DTO,但由于我是从数据库加载数据,所以我已经从 CollectionView 中获得了 DTO,我只想将整个内容传递给新视图,如下所示某种查询参数来节省资源。我该怎么做呢?

我在网上看到有人提供了一个教程,显示可以这样通过:

await Shell.Current.GoToAsync(nameof(NotePage), SelectedNote);
Run Code Online (Sandbox Code Playgroud)

但是 Visual Studio 说我的第二个参数必须是 bool,所以我猜那些教程是错误的。

有人知道是否可以通过这种方式或类似的方式从视图传递 DTO?

谢谢,

Jas*_*son 7

文档演示了如何做到这一点

基于对象的导航数据可以通过指定 IDictionary<string, object> 参数的 GoToAsync 重载来传递:

Animal animal = e.CurrentSelection.FirstOrDefault() as Animal;
var navigationParameter = new Dictionary<string, object>
{
    { "Bear", animal }
};
await Shell.Current.GoToAsync($"beardetails", navigationParameter);
Run Code Online (Sandbox Code Playgroud)

那么接收页面或VM可以这样做

[QueryProperty(nameof(Bear), "Bear")]
public partial class BearDetailPage : ContentPage
{
    Animal bear;
    public Animal Bear
    {
        get => bear;
        set
        {
            bear = value;
            OnPropertyChanged();
        }
    }

    public BearDetailPage()
    {
        InitializeComponent();
        BindingContext = this;
    }
}
Run Code Online (Sandbox Code Playgroud)