我正在实例化另一个页面,我将一个值分配给它的一个公共属性(“SomeValue”),如下所示:
_btnGotoOtherPage.Clicked += async (sender, e) =>
{
OtherPage _otherpage = new OtherPage;
_otherpage.SomeValue = 1033;
await Navigation.PushAsync(_otherpage);
return;
};
在此“_otherpage”中,用户可以修改此值。
当弹出“_otherpage”时,我想看一下“SomeValue”变量并对它做些什么。
MessagingSystem不是我需要的,因为我不希望收到有关价值变化的通知。我只想知道弹出“_otherpage”时这个值是什么。
我也不想使用Binding(如果可能的话!),因为当我处理许多这样的变量时,我觉得很难组织。
是否可以通过一个事件来做到这一点?
我的梦想解决方案是(伪代码):
private void OnPagePopped()
{
int iNewValue = PoppedPage.SomeValue;
}
谢谢。
答案 0 :(得分:1)
这就是我使用弹出窗口的方式,但它可以以相同的方式与页面样式一起使用。
这是我的小例子,期待MainPage = new NavigationPage(new Page1());
基本上是关于公共财产所在的页面上有一个Task
。此任务可以返回公共属性的值。该任务将在OnDisappearing覆盖中完成并返回公共属性。
要获取值,请按页面并等待“任务”页面.PagePoppedTask
using System;
using System.Threading.Tasks;
using Xamarin.Forms;
namespace MVVMTests
{
/// <summary>
/// A base implementation for a page, that holds a task,
/// which can be completed and returns a value of type of the generic T
/// </summary>
/// <typeparam name="T"></typeparam>
public class ResultContentPage<T> : ContentPage
{
public Task<T> PagePoppedTask { get { return tcs.Task; } }
private TaskCompletionSource<T> tcs;
public ResultContentPage()
{
tcs = new TaskCompletionSource<T>();
}
/// <summary>
/// Completes the task and sets it result
/// </summary>
/// <param name="result"></param>
protected /* virtual */ void SetPopupResult(T result)
{
if (PagePoppedTask.IsCompleted == false)
tcs.SetResult(result);
}
}
/// <summary>
/// Page1 exists of one button, that creates the Page2, assigns a value to a prop on the Page2
/// and then awaits the PagePoppedTask of Page2
/// </summary>
public class Page1 : ContentPage
{
public Page1()
{
var button = new Button()
{
Text = "Go to page 2"
};
button.Clicked += Button_Clicked;
Content = button;
}
private async void Button_Clicked(object sender, EventArgs e)
{
//Push the page
var newPage = new Page2() { CoolInt = 123 };
await App.Current.MainPage.Navigation.PushAsync(newPage);
//Await the result
int result = await newPage.PagePoppedTask;
System.Diagnostics.Debug.WriteLine("Page result: " + result.ToString());
}
}
/// <summary>
/// Inherits from the ResultContentPage and sets the PagePoppedTask as soon as its Disappearing
/// </summary>
public class Page2 : ResultContentPage<int>
{
public int CoolInt { get; set; } //Your property on the page
public Page2()
{
var button = new Button()
{
Text = "Go back to page 1"
};
button.Clicked += Button_Clicked;
Content = button;
}
private async void Button_Clicked(object sender, EventArgs e)
{
CoolInt = 321; //assign dummy value to CoolInt prop and pop the page
await App.Current.MainPage.Navigation.PopAsync(); //pop the page
}
protected override void OnDisappearing()
{
base.OnDisappearing();
SetPopupResult(CoolInt); //set the result of the task (in ResultContentPage<T>)
}
}
}
答案 1 :(得分:0)
在页面A:
MessagingCenter.Subscribe<string>(this, "SomeMessage", (s) => HandleMessage(s));
在第B页:
MessagingCenter.Send<string>("SenderOrAnythingElse", "SomeMessage");
答案 2 :(得分:0)
在PageB中有公共变量:
public int SomeValue { get; set; }
现在我们展示PageB:
PageB nPageB = new PageB;
await Navigation.PushAsync(nPageB);
在nPageB中,用户现在可以更改PageB的公共变量
//we track the "Disappearing" event of the page.
//When it occurs, we get the value
nPageB.Disappearing += async (sender1, e1) =>
{
Debug.WriteLine("New value is: " + nPage.SomeValue.ToString());
};
答案 3 :(得分:0)
如果您正在寻找理想的解决方案,我建议您遵循MVVM模式并将大量代码从页面移到视图模型。
我使用名为FreshMvvm的MVVM框架。这允许我执行视图模型来查看模型导航并在它们之间传递参数,如下所示:
await CoreMethods.PushPageModel<BPageModel>(myParameter, true);
这将myParameter传递给我可以在BPage视图模型的Init方法中访问的BPage。
当我弹出B页面(通过视图模型)时,我可以将参数传递回A页
await CoreMethods.PopPageModel(myReturnParam, true);
我可以在APageViewModel的ReverseInit方法中访问。
大多数MVVM框架都具有类似的功能。