【问题标题】:UWP Pivot control clears its content when I navigate to a other page and goes back当我导航到其他页面并返回时,UWP Pivot 控件会清除其内容
【发布时间】:2020-01-20 10:05:57
【问题描述】:

我有一个带有枢轴控件的 UWP 页面。我正在使用 MVVM 模式,其中枢轴的ItemsSource 属性绑定到我的视图模型的可观察集合。我正在使用枢轴的ItemTemplateSelector 根据枢轴SelectedItem 为每个视图模型选择适当的DataTemplate,而枢轴又绑定到选定的视图模型。

这是我正在使用的 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>

在同一页面中,我有一个导航视图,其中 navigationItem 单击事件基于所选项目创建一个新视图模型,并将其添加到可观察集合 MainPageViewModel.EditViewModels 并将 SelectedViewModel 设置为新创建的集合。

应用程序在 WPF 中但在 UWP 中缺失的隐式 DataTemplate 周围正常工作。我遇到的唯一问题是,当我从包含 Pivot 控件的页面导航并返回时,所有 Pivot 项都被清除且不显示。

我在页面构造函数中设置了this.NavigationCacheMode = Windows.UI.Xaml.Navigation.NavigationCacheMode.Required,并没有覆盖NavigateTo方法。

如果我直接在数据透视项中设置我的用户控件而不使用DataTemplate 选择器,那么当我返回页面时会保留数据透视项。仅当我使用 ItemTemplateSelector 时才会清除数据透视项目。

任何帮助将不胜感激。我花了四天多的时间来解决问题。

提前致谢

【问题讨论】:

  • 我创建了一个 ItemTemplateSelector,当我单击 navigationViewItem 时,我根据所选项目创建了一个新的视图模型,将其添加到 EditViewModels 并将 SelectedViewModel 设置为新的视图模型。我还将 NavigationCacheMode 设置为必需。之后,当我回到包含 Pivot 的页面时,内容显示良好并且没有被清除。我无法重现此问题。那么能否提供一个简单的样本,可以复制给我们测试?
  • 你在页面构造器中开启缓存模式了吗?? this.NavigationCacheMode = Windows.UI.Xaml.Navigation.NavigationCacheMode.Enabled
  • Ketan:是的,我在构造函数中有 this.NavigationCacheMode = Windows.UI.Xaml.Navigation.NavigationCacheMode.Required
  • 这里是示例代码的链接:link。每次单击列表视图都会打开一个数据透视项目。稍后,当您单击导航按钮(左上角)然后单击后退箭头时,将清除枢轴项
  • Neil:我不知道这是否有帮助,但我使用的是 1903 年构建的 Windows 10 和 Visual Studio 版本 16.4.3

标签: c# uwp pivotitem


【解决方案1】:

我查看了您的示例,发现您的 MainCrudPage_Loaded 方法总是创建了一个新的 TabelaWindow_ViewModel 实例并将其分配给您的 MainPageViewModel 属性和 DataContext: p>

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 的现有实例,所以当您返回页面时,MainPageViewModelDataContext 已经被填充(您可以通过在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();
}

希望对你有帮助。

【讨论】:

  • 非常感谢Daren和所有评论我的问题的人。这帮助很大,节省了我的一周时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-14
  • 2019-11-03
  • 2021-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多