Доступ к привязке XAML в коде позади - PullRequest
0 голосов
/ 02 мая 2018

Я работаю в Xamarin, но считаю, что это применимо к любому приложению UWP, использующему XAML.

Сначала у меня есть две страницы контента. На первой странице я хочу передать некоторые данные на вторую страницу, поэтому я делаю это как часть навигации:

    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}" />

Я хотел бы получить доступ к значению "{Binding OrderTotal}" в коде C # на второй странице. Я тоже нашел способ сделать это, но это не кажется оптимальным. Это кладжа у меня на месте:

<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). Это повсюду. Я постоянно борюсь со структурой, чтобы делать вещи, которые, по моему мнению, должны быть довольно легкими… как это Пожалуйста, помогите, но сделайте милым .

Спасибо.

EDIT:

Согласно комментарию @ Джейсона, вы можете передать объект конструктору страницы, и это сработает. Вот как выглядит переработанная функция:

    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);
    }

А потом результат отладки:

enter image description here

1 Ответ

0 голосов
/ 02 мая 2018

вместо того, чтобы PageA установить PageB's BindingContext, вместо этого передайте объект ticketOrderTotal в качестве параметра в конструкторе PageB's. Тогда PageB может установить свой собственный BindingContext, а также сохранить локальную ссылку на объект ticketOrderTotal.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...