Привязки UWP не инициализируются после InitializeComponent - PullRequest
0 голосов
/ 10 января 2020

Привязки данных не загружаются в UWP после вызова InitializeComponent. Из-за этого я получаю ошибки в моем приложении, пытающемся манипулировать вещами, с которыми обычно связаны, но на навигационных привязках не загружаются. Как правильно управлять связанными свойствами в событиях OnNavigated?

<Page
x:Class="StackApp.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="using:StackApp"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
mc:Ignorable="d">
<Grid>
    <ComboBox x:Name="cb" ItemsSource="{x:Bind Data}" />
</Grid></Page>
public sealed partial class MainPage : Page
{
    Data Data { get; set; } = Whatever;
    public MainPage()
    {
        this.InitializeComponent();

        //this.Bindings.Initialize();
        //it can solve problem by manual binding loading
    }
}

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    cb.SelectedIndex = 0; // Crash, because ComboBox has no items loaded yet
}

Ответы [ 2 ]

1 голос
/ 10 января 2020

Привязки еще не разрешены в OnNavigatedTo. Из документов :

В отличие от предыдущих платформ XAML, метод OnNavigated вызывается перед загрузкой визуального дерева. Это имеет следующие последствия:

  • Вы не можете получить доступ к действительному значению свойства Parent из переопределения OnNavigated. Если вам нужен доступ к свойству Parent, сделайте это в обработчике события Loaded.
  • Нельзя использовать OnNavigatedTo для манипулирования элементами или изменения состояния элементов управления на целевой странице. Вместо этого присоедините обработчик событий Loaded к root содержимого вновь загруженной страницы и выполните любые манипуляции с элементами, изменения состояния, привязку событий и т. Д. В обработчике Loaded.

Итак, чтобы дождаться загрузки ComboBox, вы должны обработать событие Loaded:

public sealed partial class MainPage : Page
{
    Data Data { get; set; } = Whatever;
    public MainPage()
    {
        this.InitializeComponent();
        this.Loaded += MainPage_Loaded;
    }

    private void MainPage_Loaded(object sender, RoutedEventArgs e)
    {
        cb.SelectedIndex = 0;
    }
}
0 голосов
/ 10 января 2020

Получаете ли вы ошибки от вывода? Где находится ваш класс данных? Настроен ли Datacontext?

Например, если ваш xaml выглядит так:

<Page
x:Class="StackApp.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="using:StackApp"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
mc:Ignorable="d">
<Grid>
    <Button Content="{Binding}" />
</Grid></Page>

Тогда в вашем коде позади вы должны установить DataContext следующим образом:

public sealed partial class MainPage : Page
{
    String Test { get; set; } = "John";
    public MainPage()
    {
        this.InitializeComponent();
        DataContext = Test;
    }
}
...