Я работаю в 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);
}
А потом результат отладки: