首页 > 解决方案 > 在代码隐藏中访问 XAML 绑定

问题描述

我在 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}”值。我也找到了一种方法来做到这一点,但它似乎并不是最优的。这是我所拥有的kludge:

<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)。到处都是。我一直在与框架作斗争,以做我认为应该很容易做到的事情......就像这样。请帮忙,但做个好人

谢谢你。

编辑:

根据@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);
    }

然后调试的结果:

在此处输入图像描述

标签: c#xamlxamarin.forms

解决方案


而不是PageAset PageB's BindingContext,而是将ticketOrderTotal对象作为参数传递给PageB's构造函数。然后PageB可以设置它自己BindingContext的以及保持对ticketOrderTotal对象的本地引用。


推荐阅读