c# - 如何在 Xamarin.Forms 的选项卡式页面中的页面之间共享值?
问题描述
当我在手术后住院时,有一根导管并被迫用铅笔和一张纸计算我身体的液体摄入量/流出量(!!!)......我被困在如何分享价值观上Xamarin.Forms 中选项卡式页面的页面之间。
我有一个页面 - Intake/Outflow,其中是 Entry 元素和 Button 元素,用于总摄入量和流出量更新。用户可以写下液体量并点击按钮将此部分添加到消耗的液体总量中。流出也是如此。
我的第二页是概览——概览页。我想用两个标签在概览页面上显示流体总量(进水和出水)。这就是我卡住的地方。
我尝试将 Label.Text 绑定到概览页面视图模型中的属性,但我不知道如何从 Intake/Outflow 页面后面的代码更新概览视图模型属性。我还尝试使用 App 的属性级别,这对于 OnSleep、OnResume rutines 很方便,我在其中存储用户的实际值以供进一步使用。再次,我被困在来自 Intake/Outflow 页面后面的代码的 Overview 页面上的标签更新上。此外,我不知道如何在 XAML 中为 App.SomeProperty 正确绑定属性,这也可能是问题所在。
在这种特殊情况下,页面之间共享视图模型对我来说不是一种选择。
我的逻辑错了吗?我应该如何处理这项任务?有人可以用上述逻辑分享一些例子吗?
解决方案
我的逻辑错了吗?
你的逻辑没有问题。
我应该如何处理这项任务?
用于在第一页保存数据,在调用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
方法中调用。
推荐阅读
- c++ - 如何在没有重复代码的情况下创建两个模板版本以获取数组开始和结束(使用 T* 和它)?
- python - 如何在 Django 模板中进行日期格式设置?
- python - 检查是否是同花扑克 python
- android - 为什么 CameraXBasic 项目不将两个布局文件合并为一个?
- windows - 检测进程是否正在调试;在核心地带
- encryption - 将数据安全地存储在内存中(基于密码的加密)
- mysql - Mysql - 使用唯一索引防止组合列的重复条目
- flutter - 导航到其他屏幕从应用栏中删除后退按钮
- python - 如何使用特殊字符作为字符串的“对象”类型变量?
- ionic-framework - 为什么 ionic 4 社交分享插件在浏览器中不起作用?