在MAUI中,如何将数据从登录页面传递到带有shell导航的选项卡式页面?

gojuced7  于 2023-01-13  发布在  Shell
关注(0)|答案(2)|浏览(423)

我对MAUI比较陌生,我正尝试将登录页中收集的数据传递到选项卡页。我正尝试使用shell导航方法传递数据,但它似乎在我的任何选项卡页上都不可用。
导航代码:

await Shell.Current.GoToAsync($"//PortalTabs", true, new Dictionary<string, object>
{
    //Data that must be passed to App page
    {"User", user}
});

使用Maui社区工具包,在第一个选项卡(AppViewModel)上:

//Data brought forward from previous page
[QueryProperty(nameof(User), "User")]

public partial class AppViewModel : ViewModelBase
{
    //Observable Properties
    [ObservableProperty]
    UserModel user;
    
    public AppViewModel() 
    {
    }
}

AppShell.xaml中的选项卡栏:

<!--Portal Tabs-->
 <TabBar Route="PortalTabs">
     <Tab Title="Apps">
         <ShellContent ContentTemplate="{DataTemplate views:AppPage}"/>
     </Tab>
     <Tab Title="Profile">
         <ShellContent ContentTemplate="{DataTemplate views:ProfilePage}"/>
     </Tab>
     <Tab Title="Settings">
         <ShellContent ContentTemplate="{DataTemplate views:SettingsPage}"/>
     </Tab>
 </TabBar>

我正在尝试通过以下方式使用AppPage上的数据:

<Label Text = "{Binding User.Username}"

我错过了什么明显的东西吗?

fhity93d

fhity93d1#

我发现了这个问题。路由必须是到需要数据的页面,而不是路由到TabBar。作为对Isidoros回答的回应:我的页面确实通过ViewModelBase从ObservableObject继承,并且我的绑定上下文已经设置在页面的代码后面。
工作导航:

await Shell.Current.GoToAsync($"//AppPage", true, new Dictionary<string, object>
{
    //Data that must be passed to App page
    {"User", user}
});

添加到AppShell.xaml的路由:

<!--Portal Tabs-->
<TabBar Route="PortalTabs">
    <Tab Title="Apps" Route="AppPage">
        <ShellContent ContentTemplate="{DataTemplate views:AppPage}"/>
    </Tab>
    <Tab Title="Profile">
        <ShellContent ContentTemplate="{DataTemplate views:ProfilePage}"/>
    </Tab>
    <Tab Title="Settings">
        <ShellContent ContentTemplate="{DataTemplate views:SettingsPage}"/>
    </Tab>
</TabBar>
szqfcxe2

szqfcxe22#

命令Shell.Current.GoToAsync将参数传递给页,而不是基础视图模型。请将代码移到后面的页代码中。

//Data brought forward from previous page
[QueryProperty(nameof(User), "User")]

public partial class AppPage : ContentPage
{
    User user;
    public User User
    {
        set
        {
            user = value;
            BindingContext = new AppViewModel(user);
        }
    }

    public AppPage()
    {
        InitializeComponent();
        //no binding here. Set the binding when you receive
        //the data from the property.
    }
    ....
}

您的视图模型应该如下所示(注意参数userparam和ObservableObject继承类是MVVM工作所必需的):

public partial class AppViewModel : ObservableObject
{
    //Observable Properties
    [ObservableProperty]
    User user;
    
    public AppViewModel(User userparam) 
    {
        user = userparam;
    }
}

相关问题