.NET MAUI将值从TabBar/ShellContent传递到目标页面

kkih6yb8  于 2023-11-20  发布在  .NET
关注(0)|答案(1)|浏览(223)

我有一个非常简单的TabBar,其中包含一些ShellContent元素,如下所示:

<ShellContent
    Title="Staying at Home"
    Icon="house_user_solid.png"
    ContentTemplate="{DataTemplate views:PatientEdSelectionPage}">

    <views:PatientEdSelectionPage />
</ShellContent>

字符串
ViewModel看起来像这样:

namespace Lati2d.ViewMode  
{
  public partial class PatientEdViewModel : BaseViewModel
  {
      public ObservableCollection<PatientEd> PatientEds { get; } = new();
      public ObservableCollection<Lati2d.Model.Condition> Conditions { get; } = new();
      public string PatientEd { get; set; }
      public string PatientEdTypeId { get; set; }
      public Guid ConditionId { get; set; }
      public string ConditionName { get; set; }
      public Lati2d.Model.Condition SelectedCondition { get; set; }

      PatientEdService _patientEdService;
      ConditionService _conditionService;
      public PatientEdViewModel(
          PatientEdService patientEdService,
          ConditionService conditionService)
      {
          _patientEdService = patientEdService;
          _conditionService = conditionService;

          Title = "Patient Education Titles";
      }
   }
}


这一切都工作得很好。我现在试图从ShellContent获取一个值到页面。我很乐意从页面传递某种参数或使用某种引用,返回到'编译器'。
我已经尝试了QueryParameter属性和其他一些方法,大多数似乎使用直接导航,但似乎不能让它工作。

yqlxgs2m

yqlxgs2m1#

(转载答案)
而不是内联PatientEdSelectionPage

<ShellContent ContentTemplate="{DataTemplate local:PatientEdSelectionPage}"/>

字符串
然后考虑扩展它,您可以轻松地添加属性:

<ShellContent>
    <ShellContent.ContentTemplate>
        <DataTemplate>
            <local:PatientEdSelectionPage SomeProperty="SomeValue"/>
        </DataTemplate>
    </ShellContent.ContentTemplate>
</ShellContent>


您可能还喜欢使用StaticResource

<Shell.Resources>
        <ResourceDictionary>
            <DataTemplate x:Key="patientEdSelectionTemplate">
                <local:PatientEdSelectionPage SomeProperty="SomeValue"/>
            </DataTemplate>
        </ResourceDictionary>
    </Shell.Resources>
    <!-- ... -->
    <Tab Title="PatientEdSelection">
        <ShellContent ContentTemplate="{StaticResource patientEdSelectionTemplate}"/>
    </Tab>


[Old答案]
这个答案涉及到通过GlobalViewModel单例在整个应用程序中传递属性。

public partial class GlobalViewModel : BaseViewModel


当你使用Dependency Injection时,可以这样设置:

// MauiProgram.cs
builder.Services.AddSingleton<GlobalViewModel>();
builder.Services.AddTransient<PatientEdViewModel>();


AppShell.xaml.cs中,您可以访问GlobalViewModel单例。这样,Shell就可以通过GlobalViewModel单例提供值。

public partial class AppShell : Shell
{
    public GlobalViewModel Global { get; }

    public AppShell()
    {
        InitializeComponent();
        Global = IPlatformApplication.Current.Services.GetService<GlobalViewModel>();
        BindingContext = Global;
        // set BindingContext to either this or Global.
        // Does not matter.
        // Either way, we enable `GlobalViewModel` in the Shell XAML
    }
}


因为GlobalViewModel是单例,所以你可以从Shell设置属性,也可以在PatentEdViewModel中使用相同的属性。对于后者,你可以通过依赖注入来配置PatentEdViewModel

public PatientEdViewModel(
          PatientEdService patientEdService,
          ConditionService conditionService,
          GlobalViewModel globalViewModel)
      {
          _patientEdService = patientEdService;
          _conditionService = conditionService;
          _globalViewModel = globalViewModel;


关于在AppBindingContext中声明GlobalViewModel的注解应该允许通过设置Source={RelativeSource AncestorType={x:Type viewmodel:GlobalViewModel}}来访问绑定中的GlobalViewModel,但是,将其设置为对单个视图模型的依赖也可以。

相关问题