xamarin 使用GoToAsyncDictionary传递对象,最终会收到Null.net7Maui

6uxekuva  于 2023-03-27  发布在  Go
关注(0)|答案(1)|浏览(170)

问题是,使用GoToAsync与Dictionary相结合,最终在我导航到的页面上接收到null对象。我只是卡住了......
有趣的是,也许是一个很好的提示。我在GoToAsync上有一个断点,在执行时,我的对象包含我需要的数据。下一个断点在我导航到的页面上的构造函数上,在那个断点之后,我的对象变为null。
路由设置正确。

GoToAsync

private async void ListView_ItemTapped(object sender, ItemTappedEventArgs e)
        {
            var salons = e.Item as Salons;
            await Shell.Current.GoToAsync("TemplateSalonPage", true, new Dictionary<string, object>
            {
                {"Salons", salons }
            });

我导航到页面的Viewmodel

ing xxx.Models;
using xxx.Views;
using Microsoft.Maui.Controls;
using System.Collections.ObjectModel;

namespace xxx.ViewModels;

[QueryProperty(nameof(Salons), "Salons")]
public partial class TemplateSalonViewModel : BaseViewModel
{
    public TemplateSalonViewModel()
    {
        
    }

[ObservableProperty]
Salons salon;

}

查看接收方的**.xaml**:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="xxx.Views.TemplateSalonPage"
xmlns:model="clr-namespace:xxx.Models"
xmlns:viewModels="clr-namespace:xxx.ViewModels"
x:DataType="viewModels:TemplateSalonViewModel"           Shell.NavBarIsVisible="False"        Shell.TabBarIsVisible="False">

<StackLayout HorizontalOptions="FillAndExpand">
<VerticalStackLayout>
            <Label Text="{Binding Salon.id}"
                               FontSize="Large"
                               FontAttributes="Bold" 
                               VerticalOptions="Center"
                               BackgroundColor="Yellow"
                               TextColor="Black"
                                   HeightRequest="150"/>
        </VerticalStackLayout>
</StackLayout>
</ContentPage>

尝试了命名我的对象,字典的任何可能的变化,但找不到问题。绑定工作,因为我能够附加在视图中。

nqwrtyyt

nqwrtyyt1#

您误解了[QueryProperty(nameof(Salons), "Salons")],在您的代码中,属性名是salon,因为您使用了[ObservableProperty],所以salon将被声明为Salon
因此,视图模型应该是:

[QueryProperty(nameof(Salon), "Salons")]
public partial class TemplateSalonViewModel : BaseViewModel
{
    public TemplateSalonViewModel()
    {
        
    }

[ObservableProperty]
Salons salon;

}

在xaml中,您还需要使用Salon.Id.sich作为:

<Label Text="{Binding Salon.Id}"

有关更多信息,您可以参考有关ObservableProperty attribute的官方文档。

我用CommunityToolkit.Mvvm nuget包创建了一个示例:

视图模型:

[QueryProperty(nameof(Persiontest),"Person")]
    public partial class ViewModelTest : ObservableObject
    {
        [ObservableProperty]
        Person persiontest;
    }

Model类:

public partial class Person : ObservableObject
    {
        [ObservableProperty]
        public string name;
        [ObservableProperty]
        public int id;
    }

然后使用Shell.Current.后藤():

var persons = new Person() { Id = 1,Name="AAAAAA" };
await Shell.Current.GoToAsync("NewPage1", true, new Dictionary<string, object>() { { "Person", persons }}) ;

和页面.xaml:

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local ="clr-namespace:Testinherit"
             x:Class="Testinherit.NewPage1"
             Title="NewPage1">
    <ContentPage.BindingContext>
        <local:ViewModelTest/>
    </ContentPage.BindingContext>
    <VerticalStackLayout>
        <Label x:Name="label" Text="{Binding Persiontest.Name}"/>
    </VerticalStackLayout>
</ContentPage>

相关问题