c# - 当我导航到其他页面并返回时,UWP Pivot 控件会清除其内容
问题描述
我有一个带有枢轴控件的 UWP 页面。我正在使用 MVVM 模式,其中ItemsSource
枢轴的属性绑定到我的视图模型的可观察集合。我正在使用ItemTemplateSelector
枢轴来根据枢轴为每个视图模型选择适当的数据模板,枢轴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 单击事件基于所选项目创建一个新视图模型,并将其添加到可观察集合MainPageViewModel.EditViewModels
并将其设置SelectedViewModel
为新创建的集合。
该应用程序在 WPF 中但在 UWP 中缺失的隐式 DataTemplate 周围正常工作。我遇到的唯一问题是,当我从包含 Pivot 控件的页面导航并返回时,所有 Pivot 项都被清除且不显示。
我已经在页面构造函数中设置了this.NavigationCacheMode = Windows.UI.Xaml.Navigation.NavigationCacheMode.Required
,并没有覆盖该NavigateTo
方法。
如果我在不使用选择器的情况下直接在 Pivot Items 中设置我的用户控件,DataTemplate
那么当我返回页面时,Pivot 项目将被保留。仅当我使用ItemTemplateSelector
.
任何帮助将不胜感激。我花了四天多的时间来解决这个问题。
提前致谢
解决方案
我查看了您的示例并注意到您的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();
}
我希望这会有所帮助。
推荐阅读
- python - 如何在列中仅放置部分字符串值?
- excel - Excel VBA,比较两个不同列中的值并保留整行以获得共同值
- javascript - 尝试使用 getElementById 更改 innerHTML 时,ng-repeat 不起作用
- arduino - 错误:没有匹配函数调用 'UdpContext::listen(const ip_addr_t&, int&)' if(!_udp_ota->listen(*IP_ADDR_ANY, _port))
- angular - 创建新 Angular 项目后的多个 karma.conf.js 文件
- c++ - 如何计算OpenCV中每个圆圈中的像素数?
- excel - 以只读访问权限写入数据库 [TSQL 存储过程]
- http - HTTP 的登录方法
- javascript - How do I get these two elements to align side by side?
- r - 如何在 Mac OS X 10.14 中安装 Rsymphony