【发布时间】:2018-05-01 22:12:56
【问题描述】:
我在 Xamarin 中工作,但我相信这适用于任何使用 XAML 的 UWP 应用程序。
首先我有两个 ContentPages。在第一页上,我想将一些数据传递给第二页,所以我将其作为导航的一部分:
async void BuyTickets(object sender, EventArgs e)
{
var ticketOrderTotal = new TicketOrder
{
OrderTotal = lblOrderAmount.Text,
OrderTotalList = ticketsPrices.Where(o => o.TicketQuantity > 0).ToList<Ticket>()
};
var paymentPage = new PaymentPage();
paymentPage.BindingContext = ticketOrderTotal;
await Navigation.PushAsync(paymentPage);
}
以上在 XAML 中运行良好。例如,在第二页 (PaymentPage) 上,我可以像这样引用 BindingContext,并且 Text 属性是正确的:
<Label x:Name="lblOrderAmount" Text="{Binding OrderTotal}" />
我想做的是访问第二页 C# 代码隐藏中的“{Binding OrderTotal}”值。我也找到了一种方法来做到这一点,但它似乎并不是最优的。这是我所拥有的:
<Label x:Name="lblOrderAmount" Text="{Binding OrderTotal}" BindingContextChanged="GetChargeAmount" />
这是标签的代码隐藏:
public static string m_charge_amount = "";
...
private void GetChargeAmount(object sender, EventArgs e)
{
var lbl = ((Label)sender);
m_charge_amount = lbl.Text;
}
所以我的问题是:有没有更好的方法来做到这一点?研究起来特别困难,因为 XAML 似乎植根于 WPF、Silverlight、Xamarin、Windows 8 以及现在的 Windows 10 (UWP)。到处都是。我一直在与框架进行斗争,以做我认为应该很容易做到的事情......就像这样。请帮忙做be nice。
谢谢。
编辑:
根据@Jason 的评论,您可以将一个对象传递给页面构造函数,这样就可以了。这是重新设计的函数现在的样子:
async void BuyTickets(object sender, EventArgs e)
{
var ticketOrderTotal = new TicketOrder
{
OrderTotal = lblOrderAmount.Text,
OrderTotalList = ticketsPrices.Where(o => o.TicketQuantity > 0).ToList<Ticket>()
};
var paymentPage = new PaymentPage(ticketOrderTotal);
paymentPage.BindingContext = ticketOrderTotal;
await Navigation.PushAsync(paymentPage);
}
然后是调试结果:
【问题讨论】:
-
不是让 PageA 设置 PageB 的 BindingContext,而是将 ticketOrderTotal 对象作为参数传递给 PageB 的构造函数。然后 PageB 可以设置它自己的 BindingContext 以及保持对 ticketOrderTotal 对象的本地引用。
-
谢谢@Jason。我会试试看的。
-
我不敢相信我花了几个小时寻找这个简单的解决方案。您可以发布为答案,我将其标记为正确。发送。
标签: c# xaml xamarin.forms