有没有一种方法可以将参数从BlazorWebView中的Blazor组件传递回.NET MAUI中的XAML页面背后的代码(又名EventCallBack?))

ux6nzvsh  于 2023-05-04  发布在  .NET
关注(0)|答案(1)|浏览(179)

我在MAUI Blazor Hybrid应用程序中有一个ContentPage,它带有一个显示基本表单组件的BlazorWebView(BWV)。我知道如何将参数传递给BWV的RootComponent,以便Blazor组件可以访问信息,但我不知道如何反向操作,将组件的响应传递给. xaml.cs代码隐藏文件。本质上,我想做一个EventCallBack,就像Blazor中的子组件将信息传递给其父组件一样。我似乎找不到任何关于这方面的信息,所以任何帮助将不胜感激!
我尝试在Blazor组件中创建一个EventCallBack,并将其绑定到XAML中的BWV,但我似乎找不到合适的方法来实现这一点。

w9apscun

w9apscun1#

你的问题不是很清楚,但我假设你正在尝试在blazor页面和maui页面之间共享数据/信息。为此,我将使用依赖注入和状态容器来存储和共享数据。
创建一个类并通过依赖注入添加它。(也可以使用接口)。下面的代码片段可能会有所帮助。
创建类来保存数据:MySessionValues.cs

public class MySessionValues
{
    public string Id { get; set; }
    public string FirstName { get; set; }
    public string Amount { get; set; }
    public DateTime LastLoginTime { get; set; }
}

为依赖注入注册类:MauiProgram.cs

//Register dependency injection for Maui pages bellow:
    builder.Services.AddSingleton<App>();
    //To be used by Maui and Blazor pages
    builder.Services.AddSingleton<MySessionValues>();

现在在你的blazor页面中,注入MySessionValues类:MyBlazorPage1.razor

@inject MySessionValues _mySessionValues;
//get your values from your state class like so.
<label @bind="_mySessionvalues.FirstName" />

<button class="btn btn-primary" @onclick="SetMyValues">Set My Values</button>

private async void SetMyValues()
    {
//you can set your values however you want. Typically from an api call
        _mySessionvalues.FirstName = "Dave";
        _mySessionvalues.Amount = "5000.98";
        _mySessionvalues.LastLoginTime = DateTime.Now;
        _mySessionvalues.Id = "12345";
    }

你的状态在页面之间保持不变,因为它是一个单例。在Maui页面端,依赖注入从根应用程序启动。因此,在app.xaml.cs文件中,像这样将state类注入到构造函数中。

public App(MySessionValues _mySessionValues)
{
    InitializeComponent();

    MainPage = new MainPage();
}

然后,每当你想在任何Maui页面中使用MySessionValues时,只需将其注入到该页面的构造函数中,如下所示:TestMauiPage.xaml.cs

public TestMauiPage(MySessionValues _mySessionValues)
    {
        InitializeComponent();
        mylabel.Text = _mySessionValues.FirstName;
    }

在TestMauiPage.xaml中:只需命名默认标签,这样您就可以从代码中引用它,或者您可以使用绑定。你应该看到你的价值观。

<VerticalStackLayout>
        <Label 
            Text="Welcome to .NET MAUI!"
            x:Name="mylabel"
            TextColor="Black"
            VerticalOptions="Center" 
            HorizontalOptions="Center" />
    </VerticalStackLayout>

请记住,无论何时调用Maui页面,都必须传递一个MySessionValues,因为构造函数不再是无参数的。例

App.Current.MainPage.Navigation.PushModalAsync(new MyMauiPages.TestMauiPage(_mySessionvalues));

注意:在app.xaml.cs文件中,最好将_mySessionValues注入MainPage,这样你的状态就可以被你的根maui页面访问。

public App(MySessionValues _mySessionValues)
    {
        InitializeComponent();

        MainPage = new MainPage(_mySessionValues);
    }

如果你需要同时显示Maui页面和Razor页面,并进行真实的数据交换,那么你需要在你的类中订阅一个Notification事件。

相关问题