繁体   English   中英

在代码隐藏中访问XAML绑定

[英]Access XAML binding in code-behind

我在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)中,因此特别难以研究。 到处都是。 我一直在与框架竞争,以完成我认为应该很容易做的事情。 请帮忙,但要很好

谢谢。

编辑:

根据@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's BindingContext ,而是将ticketOrderTotal对象作为参数传递给PageB's构造函数。 然后PageB可以设置它自己的BindingContext并保留对ticketOrderTotal对象的本地引用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM