如何在 Xamarin.Forms 的标签页中的页面之间共享值?

How to share values between pages in Tabbed page in Xamarin.Forms?

当我在手术后住院时,有导管并被迫用铅笔和 sheet 纸计算我 body 的液体 intake/outflow( !!!)...我在 Xamarin.Forms.

的选项卡式页面上陷入了如何在页面之间共享值的问题

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

我的第二页是概览 - 概览页。我想在带有两个标签的概览页面上显示液体总量(摄入量和流出量)。这就是我卡住的地方。

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

在这种特殊情况下,我无法选择在页面之间共享视图模型。

我的逻辑错了吗?我应该如何处理这个任务?能否有人body分享一些符合上述逻辑的例子?

Is my logic wrong?

你的逻辑没有问题。

How should I approach to this task?

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

Could somebody share some example with the logic described above?

我会建议你使用Xamarin.Essentials: Preferences to realize it , will be sample .By the way , also need to Page notification events来帮助。你可以在页面显示时使用OnAppearing方法更新数据。

这是一个例子:PageA 和 PageB

PageA 使用 Button 单击方法保存来自 Entry 的文本,如下所示:

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

PageB 可以在 OnAppearing 方法中从 Preferences 获取数据,如下所示:

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方法中调用。

就用MessagingCenter,喜欢 在 OverviewViewModel

public OverviewViewModel(){
 MessagingCenter.Subscribe<IntakeOutflowViewModel, string>(this, "LabelChanged", (sender, label)=>{
   this.LabelValue = label; // use value of label from IntakeOutflowViewModel
})
}

在 IntakeOutflowViewModel 上

public ICommand ButtonCommand => new Command(()=>{
    MessagingCenter.Send<IntakeOutflowViewModel,string>(this, "LabelChanged", LabelValue);
})
public string LabelValue{...,...} // The value you bind on view

希望对您有所帮助