当我导航到另一个页面并返回时,UWP Pivot 控件清除其内容
UWP Pivot control clears its content when I navigate to a other page and goes back
我有一个带有枢轴控件的 UWP 页面。我正在使用 MVVM 模式,其中枢轴的 ItemsSource
属性 绑定到我的视图模型的可观察集合。我正在使用枢轴的 ItemTemplateSelector
到 select 每个基于枢轴 SelectedItem
的视图模型的适当数据模板,而枢轴 SelectedItem
又绑定到 selected 视图模型。
这里是我正在使用的 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 单击事件基于 selected 项目创建一个新的视图模型并将其添加到可观察集合 MainPageViewModel.EditViewModels
并设置SelectedViewModel
到新创建的。
应用程序在 WPF 中但在 UWP 中缺失的隐式 DataTemplate 周围正常工作,正如预期的那样。我遇到的唯一问题是,当我从包含 Pivot 控件的页面导航并返回时,所有 Pivot 项目都被清除并且没有显示。
我已经在页面构造函数中设置了 this.NavigationCacheMode = Windows.UI.Xaml.Navigation.NavigationCacheMode.Required
并且没有覆盖 NavigateTo
方法。
如果我在不使用 DataTemplate
select 的情况下直接在 Pivot Items 中设置我的用户控件,或者当我返回页面时,Pivot items 会被保留。只有当我使用 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
的现有实例,当您 return 到页面时 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();
}
希望对您有所帮助。
我有一个带有枢轴控件的 UWP 页面。我正在使用 MVVM 模式,其中枢轴的 ItemsSource
属性 绑定到我的视图模型的可观察集合。我正在使用枢轴的 ItemTemplateSelector
到 select 每个基于枢轴 SelectedItem
的视图模型的适当数据模板,而枢轴 SelectedItem
又绑定到 selected 视图模型。
这里是我正在使用的 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 单击事件基于 selected 项目创建一个新的视图模型并将其添加到可观察集合 MainPageViewModel.EditViewModels
并设置SelectedViewModel
到新创建的。
应用程序在 WPF 中但在 UWP 中缺失的隐式 DataTemplate 周围正常工作,正如预期的那样。我遇到的唯一问题是,当我从包含 Pivot 控件的页面导航并返回时,所有 Pivot 项目都被清除并且没有显示。
我已经在页面构造函数中设置了 this.NavigationCacheMode = Windows.UI.Xaml.Navigation.NavigationCacheMode.Required
并且没有覆盖 NavigateTo
方法。
如果我在不使用 DataTemplate
select 的情况下直接在 Pivot Items 中设置我的用户控件,或者当我返回页面时,Pivot items 会被保留。只有当我使用 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
的现有实例,当您 return 到页面时 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();
}
希望对您有所帮助。