如何在 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
希望对您有所帮助
当我在手术后住院时,有导管并被迫用铅笔和 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
希望对您有所帮助