C# 当我导航到另一个页面并返回时,UWP Pivot控件将清除其内容

C# 当我导航到另一个页面并返回时,UWP Pivot控件将清除其内容,c#,uwp,pivotitem,C#,Uwp,Pivotitem,我有一个带有透视控件的UWP页面。我正在使用MVVM模式,其中pivot的ItemsSource属性绑定到我的viewmodels的可观察集合。我正在使用pivot的ItemTemplateSelector根据pivotSelectedItem为每个视图模型选择适当的数据模板,该数据模板又绑定到所选视图模型 下面是我正在使用的XAML: <Pivot Grid.Column="1" Grid.Row="1" Grid.RowSpan="2" Margin="10" IsHeaderIt

我有一个带有透视控件的UWP页面。我正在使用MVVM模式,其中pivot的
ItemsSource
属性绑定到我的viewmodels的可观察集合。我正在使用pivot的
ItemTemplateSelector
根据pivot
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>

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

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

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

如果我不使用
DataTemplate
选择器直接在透视项目中设置usercontrols,那么当我返回页面时,透视项目将得到维护。仅当我使用
ItemTemplateSelector
时,才会清除透视项目

任何帮助都将不胜感激。我花了四天多的时间在这上面,却没能找出问题所在


提前感谢

我查看了您的示例,发现您加载的
MainCrudPage
方法总是创建
TabelaWindow\u ViewModel
的新实例,并将其分配给
MainPageViewModel
属性和
DataContext

private async void MainCrudPage\u已加载(对象发送方,路由目标)
{
MainPageViewModel=new TabelaWindow_ViewModel();//Sinergia.UWP.BootStrap.AppContainer.Container.Resolve();
//等待MainPageViewModel.LoadAsync();
DataContext=MainPageViewModel;
//naviView.DataContext=MainPageViewModel.NavigationVM;
this.Bindings.Update();
}
由于总是调用
Loaded
事件,无论是否缓存
页面
,在返回时都会有效覆盖缓存的数据视图模型数据。由于页面缓存重用了
MainPage
的现有实例,因此当您返回页面时,
MainPageViewModel
DataContext
已经被填充(您可以通过在加载的
MainCrudPage\u
方法的开头放置一个断点来检查这一点)

如果您将样本更新为以下内容,您将了解我的意思:

private async void MainCrudPage\u已加载(对象发送方,路由目标)
{
if(null==DataContext)
{
MainPageViewModel=new TabelaWindow_ViewModel();//Sinergia.UWP.BootStrap.AppContainer.Container.Resolve();
//等待MainPageViewModel.LoadAsync();
DataContext=MainPageViewModel;
}
//naviView.DataContext=MainPageViewModel.NavigationVM;
this.Bindings.Update();
}

我希望这会有所帮助。

我创建了一个ItemTemplateSelector,当我单击navigationViewItem时,我基于所选项目创建了一个新的viewmodel,将其添加到EditViewModels中,并将SelectedViewModel设置为新的viewmodel。我还将NavigationCacheMode设置为Required。之后,当我回到包含Pi的页面时vot,内容显示良好且未清除。我无法复制此问题。因此,您能否提供一个简单的示例,供我们复制以进行测试?您是否在页面构造函数中启用了缓存模式???
this.NavigationCacheMode=Windows.UI.Xaml.Navigation.NavigationCacheMode.Enabled
Ketan:是的,我有这个.NavigationCacheMode=Windows.UI.Xaml.Navigation.NavigationCacheMode.Required在构造函数中这里是示例代码的链接:。每次单击列表视图都将打开一个透视项目。稍后,当您单击导航按钮(左上角)时Neil:我不知道这是否有帮助,但我使用的是1903版windows 10,visual studio版本为16.4.3。感谢Daren和所有评论我的问题的人。这帮了我很大的忙,节省了我一周的时间。