首页 > 解决方案 > 如何在 Xamarin.Forms 的选项卡式页面中的页面之间共享值?

问题描述

当我在手术后住院时,有一根导管并被迫用铅笔和一张纸计算我身体的液体摄入量/流出量(!!!)......我被困在如何分享价值观上Xamarin.Forms 中选项卡式页面的页面之间。

我有一个页面 - Intake/Outflow,其中是 Entry 元素和 Button 元素,用于总摄入量和流出量更新。用户可以写下液体量并点击按钮将此部分添加到消耗的液体总量中。流出也是如此。

我的第二页是概览——概览页。我想用两个标签在概览页面上显示流体总量(进水和出水)。这就是我卡住的地方。

我尝试将 Label.Text 绑定到概览页面视图模型中的属性,但我不知道如何从 Intake/Outflow 页面后面的代码更新概览视图模型属性。我还尝试使用 App 的属性级别,这对于 OnSleep、OnResume rutines 很方便,我在其中存储用户的实际值以供进一步使用。再次,我被困在来自 Intake/Outflow 页面后面的代码的 Overview 页面上的标签更新上。此外,我不知道如何在 XAML 中为 App.SomeProperty 正确绑定属性,这也可能是问题所在。

在这种特殊情况下,页面之间共享视图模型对我来说不是一种选择。

我的逻辑错了吗?我应该如何处理这项任务?有人可以用上述逻辑分享一些例子吗?

标签: c#xamlxamarin.formsbindingtabbedpage

解决方案


我的逻辑错了吗?

你的逻辑没有问题。

我应该如何处理这项任务?

用于在第一页保存数据,在调用page方法时Preferences在第二页获取数据。OnAppearing

有人可以用上述逻辑分享一些例子吗?

我会推荐您使用Xamarin.Essentials: Preferences来实现它,将是示例。顺便说一下,还需要Page 通知事件来帮助。您可以在 Page 显示时使用OnAppearing方法更新数据。

这是一个示例:PageA 和 PageB

使用Button单击方法保存文本的 PageA如下Entry

private void Button_Clicked(object sender, EventArgs e)
{
     var inputText = entry.Text; //get value from Entry
     Preferences.Set("my_key", inputText);
}

PageBPreferences可以从以下方法中获取数据OnAppearing

protected override void OnAppearing()
{
    base.OnAppearing();

    var myValue = Preferences.Get("my_key", "default_value");
    label.Text = myValue; // show value for Label in second page
}

注意:在表单using Xamarin.Essentials中启用首选项。

==================================================== ============================

或者解决方案,您可以使用Jason 所说的MessagingCenter来实现它。您可以参考文档来研究它,这里是您的逻辑示例。

PageA:单击按钮时发送消息:

private void Button_Clicked(object sender, EventArgs e)
{
     var inputText = entry.Text; //get value from Entry
     MessagingCenter.Send<object, string>(this, "MessageKey", inputText);
}

PageB : 在 ContentPage 中订阅消息

public SecondPage()
{
    InitializeComponent();
    MessagingCenter.Subscribe<object, string>(this, "MessageKey", (sender, arg) =>
    {
        label.Text = arg; //get value from Entry
        Console.WriteLine("get value ---" + arg);
    });
}

注意:这里的订阅也可以在OnAppearing方法中调用。


推荐阅读