Элемент управления UWP Pivot очищает свое содержимое при переходе на другую страницу и возвращается - PullRequest
0 голосов
/ 20 января 2020

У меня есть страница UWP с управлением сводкой. Я использую шаблон MVVM, где свойство ItemsSource сводной области связано с наблюдаемой коллекцией моих моделей представления. Я использую ItemTemplateSelector сводной диаграммы, чтобы выбрать соответствующий DataTemplate для каждой модели представления на основе сводной диаграммы SelectedItem, которая, в свою очередь, связана с выбранной моделью представления.

Здесь XAML, которым я являюсь используя:

<Pivot  Grid.Column="1" Grid.Row="1" Grid.RowSpan="2" Margin="10" 
IsHeaderItemsCarouselEnabled="False" 
ItemsSource ="{x:Bind MainPageViewModel.EditViewModels}"  
SelectedItem="{x:Bind MainPageViewModel.SelectedEntityViewModel,Mode=TwoWay}"
ItemTemplateSelector="{StaticResource DetailViewTemplateSelector}"  >
<Pivot.HeaderTemplate>
    <DataTemplate x:DataType="viewModel:DetailViewModelBase">
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="{Binding TabHeader,Mode=OneWay}" FontSize="12" 
               VerticalAlignment="Center"/>
       </StackPanel >
    </DataTemplate>
</Pivot.HeaderTemplate>
</Pivot>

На той же странице у меня есть навигационное представление, в котором событие нажатия навигационного элемента создает новую модель представления на основе выбранного элемента и добавляет ее в наблюдаемую коллекцию MainPageViewModel.EditViewModels и задает SelectedViewModel к вновь созданному.

Приложение работает нормально, как и ожидалось, работает неявным образом DataTemplate, который находится в WPF и отсутствует в UWP. Единственная проблема, с которой я сталкиваюсь, заключается в том, что при переходе со страницы, содержащей элементы управления Pivot, и при ее возврате все элементы Pivot очищаются и не отображаются.

Я установил в конструкторе страниц this.NavigationCacheMode = Windows.UI.Xaml.Navigation.NavigationCacheMode.Required и не переопределяет метод NavigateTo.

Если я устанавливаю свои пользовательские элементы управления непосредственно в элементах Pivot без использования селектора DataTemplate, то элементы Pivot сохраняются, когда я возвращаюсь на страницу. Сводные элементы очищаются только тогда, когда я использую ItemTemplateSelector.

. Любая помощь будет принята с благодарностью. Я потратил на это более четырех дней, не имея возможности выяснить проблему.

Заранее спасибо

1 Ответ

0 голосов
/ 22 января 2020

Я посмотрел на ваш пример и заметил, что ваш MainCrudPage_Loaded метод всегда создает новый экземпляр TabelaWindow_ViewModel и присваивает его свойству MainPageViewModel и DataContext:

private async void MainCrudPage_Loaded(object sender, RoutedEventArgs e)
{
    MainPageViewModel = new TabelaWindow_ViewModel();// Sinergia.UWP.BootStrap.AppContainer.Container.Resolve<Sinergia.UWP.ViewModels.Window.TabelaWindow_ViewModel>();
    //await MainPageViewModel.LoadAsync();
    DataContext = MainPageViewModel;
    //naviView.DataContext = MainPageViewModel.NavigationVM;
    this.Bindings.Update();
}

Поскольку событие Loaded вызывается всегда, независимо от того, кэшируется ли Page, вы фактически перезаписываете кэшированные данные, просматривая данные модели при переходе назад. Поскольку кэш страницы повторно использует существующий экземпляр MainPage, MainPageViewModel и DataContext уже заполнены, когда вы возвращаетесь на страницу (это можно проверить, поставив точку останова в начале метода MainCrudPage_Loaded.

Если вы обновите свой образец следующим образом, вы поймете, что я имею в виду:

private async void MainCrudPage_Loaded(object sender, RoutedEventArgs e)
{
    if (null == DataContext)
    {
        MainPageViewModel = new TabelaWindow_ViewModel();// Sinergia.UWP.BootStrap.AppContainer.Container.Resolve<Sinergia.UWP.ViewModels.Window.TabelaWindow_ViewModel>();
        //await MainPageViewModel.LoadAsync();
        DataContext = MainPageViewModel;
    }
    //naviView.DataContext = MainPageViewModel.NavigationVM;
    this.Bindings.Update();
}

Надеюсь, это поможет.

...