Width="5"运行效果如下:可以看到,Binding到后台数据的内容可以持久化保存,但是没有Binding(左侧的TextBox)或者UI上的元素(GridSplitter)的位置没有持久化保存。_wpf中控件tabcontrol绑定tabitem">
当前位置:   article > 正文

示例:WPF中如何处理TabControl页面绑定ItemsSource切换TabItem时UI数据没有持久保存的问题_wpf中控件tabcontrol绑定tabitem

wpf中控件tabcontrol绑定tabitem

一、目的:在WPF开发过程中,经常用到TabControl,也会遇到类似问题,用TabControl绑定数据源ItemsSource时,切换TabItem时,UI上的数据没有持久保存,本文介绍一种处理方式,可以做到缓存页面,只在切换TabItem时Load一次,重复切换TabItem时不会重复Load


二、实现

首先介绍遇到问题的写法

  1. <TabItem Header="TabControl页面数据没有缓存">
  2. <TabControl ItemsSource="{h:GetStudents Count=10}">
  3. <TabControl.Resources>
  4. <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
  5. <DataTemplate DataType="{x:Type h:Student}">
  6. <Grid Loaded="Grid_Loaded">
  7. <Grid.ColumnDefinitions>
  8. <ColumnDefinition Width="100" />
  9. <ColumnDefinition Width="5" />
  10. <ColumnDefinition />
  11. </Grid.ColumnDefinitions>
  12. <TextBox HorizontalAlignment="Stretch" />
  13. <GridSplitter Grid.Column="1"
  14. Width="5"
  15. ResizeBehavior="PreviousAndNext" />
  16. <h:Form Grid.Column="2"
  17. SelectObject="{Binding}" />
  18. </Grid>
  19. </DataTemplate>
  20. </TabControl.Resources>
  21. <TabControl.ItemTemplate>
  22. <DataTemplate>
  23. <TextBlock Text="{Binding Name}" />
  24. </DataTemplate>
  25. </TabControl.ItemTemplate>
  26. </TabControl>
  27. </TabItem>

运行效果如下:

        可以看到,Binding到后台数据的内容可以持久化保存,但是没有Binding(左侧的TextBox)或者UI上的元素(GridSplitter)的位置没有持久化保存

使用ListBox作为容器修改后的写法

  1. <TabItem Header="TabControl持久保存页面">
  2. <TabControl ItemsSource="{h:GetStudents Count=10}">
  3. <TabControl.Resources>
  4. <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
  5. <DataTemplate DataType="{x:Type h:Student}">
  6. <Grid Loaded="Grid_Loaded">
  7. <Grid.ColumnDefinitions>
  8. <ColumnDefinition Width="100" />
  9. <ColumnDefinition Width="5" />
  10. <ColumnDefinition />
  11. </Grid.ColumnDefinitions>
  12. <TextBox HorizontalAlignment="Stretch" />
  13. <GridSplitter Grid.Column="1"
  14. Width="5"
  15. ResizeBehavior="PreviousAndNext" />
  16. <h:Form Grid.Column="2"
  17. SelectObject="{Binding}" />
  18. </Grid>
  19. </DataTemplate>
  20. </TabControl.Resources>
  21. <TabControl.ItemTemplate>
  22. <DataTemplate>
  23. <TextBlock Text="{Binding Name}" />
  24. </DataTemplate>
  25. </TabControl.ItemTemplate>
  26. <TabControl.ContentTemplate>
  27. <DataTemplate>
  28. <ListBox ItemsSource="{Binding RelativeSource={RelativeSource AncestorType=TabControl}, Path=ItemsSource}"
  29. SelectedItem="{Binding RelativeSource={RelativeSource AncestorType=TabControl}, Path=SelectedItem}">
  30. <ListBox.ItemsPanel>
  31. <ItemsPanelTemplate>
  32. <Grid />
  33. </ItemsPanelTemplate>
  34. </ListBox.ItemsPanel>
  35. <ListBox.ItemContainerStyle>
  36. <Style TargetType="ListBoxItem">
  37. <Setter Property="Visibility" Value="{Binding RelativeSource={RelativeSource Mode=Self}, Path=IsSelected, Converter={StaticResource BooleanToVisibilityConverter}}" />
  38. <Setter Property="HorizontalContentAlignment" Value="Stretch" />
  39. <Setter Property="VerticalContentAlignment" Value="Stretch" />
  40. <Setter Property="Template">
  41. <Setter.Value>
  42. <ControlTemplate TargetType="ListBoxItem">
  43. <ContentPresenter />
  44. </ControlTemplate>
  45. </Setter.Value>
  46. </Setter>
  47. </Style>
  48. </ListBox.ItemContainerStyle>
  49. </ListBox>
  50. </DataTemplate>
  51. </TabControl.ContentTemplate>
  52. </TabControl>
  53. </TabItem>

        相比之前的有问题的写法实际上是增加了TabControl.ContentTemplate的配置,改用ListBox,使用Grid作为ListBox的 ItemsPanel,每次切换TabItem时实际上是切换ListBox中ListBoxItem的显示和隐藏,这样就可以做到切换页面的持久化保存和Load只加载一次的效果。

运行效果如下:

五、需要了解的知识点

TabControl 样式和模板 - WPF .NET Framework | Microsoft Learn 

TabControl 类 (System.Windows.Controls) | Microsoft Learn 

ListBox 类 (System.Windows.Controls) | Microsoft Learn 

System.Windows.Controls 命名空间 | Microsoft Learn

六、源码地址

GitHub - HeBianGu/WPF-ControlDemo: 示例

GitHub - HeBianGu/WPF-ControlBase: Wpf封装的自定义控件资源库

GitHub - HeBianGu/WPF-Control: WPF轻量控件和皮肤库

七、了解更多

System.Windows.Controls 命名空间 | Microsoft Learn

https://github.com/HeBianGu

HeBianGu的个人空间-HeBianGu个人主页-哔哩哔哩视频

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/918513
推荐阅读
相关标签
  

闽ICP备14008679号