04、数据绑定控件 ListBox 的一个 Bug
2015-03-06 17:03
357 查看
同事这两天在做 universal 项目的时候,遇到一个诡异的问题,即使设置 Page 为
缓存状态, 在页面跳转后, ListBox 的位置不会被缓存,怀疑是页面的缓存状态出了问题:
写了一个 demo,测试了一下:
1)在程序启动的时候,默认显示 PivotPage 页面。分别放置 ListView、 ItemsControl、ListBox 控件:
2)在 C# 页面,进行数据绑定:
放置一个跳转按钮:
页面启动后,分别滑动 ListView、ItemsControl、ListBox 控件:
3)点击 按钮,跳转到 Page2, 然后再 点击 GoBack 按钮:
回到 PivotPage 后, 滑动 ListBox 控件,就会诡异的返回到第一项。而 ListView 和 ItemsControl 没有这个问题:
另外,我怀疑,在 store app 中,ListBox 其实是作为一个 multiple ListPicker 用的,
数据绑定重点使用 ListView 和 GridView 了,个人的猜测 ....
补充:
1、针对 ListBox:
ItemsPanel 属性 默认应该是 VirtualizingStackPanel ,当返回的时候,会返回顶部:
当换为 ItemsStackPanel 时,就没问题了,导航返回后,单击不会返回顶部:
(ItemsStackPannel: MSDN)
2、 ListView 控件在做 折行布局时,如果 ListView 的ItemsPanel属性为WrapGrid 则在 Navigate back 的时候,
如果滑动列表,则会返回顶部;如果为 ItemsWrapGrid,则不会:
Demo 下载链接
Demo2 下载链接
缓存状态, 在页面跳转后, ListBox 的位置不会被缓存,怀疑是页面的缓存状态出了问题:
this.NavigationCacheMode = Windows.UI.Xaml.Navigation.NavigationCacheMode.Enabled;
写了一个 demo,测试了一下:
1)在程序启动的时候,默认显示 PivotPage 页面。分别放置 ListView、 ItemsControl、ListBox 控件:
<Pivot Title="Pivot"> <PivotItem Header="PivotItem 1"> <Grid> <ListView x:Name="lv1" ItemsSource="{Binding list}"/> </Grid> </PivotItem> <PivotItem Header="PivotItem 2"> <Grid> <ScrollViewer> <ItemsControl x:Name="lv2" ItemsSource="{Binding list}"/> </ScrollViewer> </Grid> </PivotItem> <PivotItem Header="PivotItem 3"> <Grid> <ListBox IsTapEnabled="False" x:Name="lv3" ItemsSource="{Binding list}"/> </Grid> </PivotItem> </Pivot> <Button Content="Page2" Click="Button_Click" HorizontalAlignment="Left" Margin="261,531,0,0" VerticalAlignment="Top"/>
2)在 C# 页面,进行数据绑定:
public List<string> list { get; set; } public PivotPage() { this.InitializeComponent(); this.NavigationCacheMode = Windows.UI.Xaml.Navigation.NavigationCacheMode.Enabled; // 填充字符串 list = new List<string>(); for (int i = 1; i < 200; i++) { list.Add("测试内容 : " + i); } // 设置当前页面的上下文为 this this.DataContext = this; }
放置一个跳转按钮:
private void Button_Click(object sender, RoutedEventArgs e) { Frame.Navigate(typeof(Page2)); }
页面启动后,分别滑动 ListView、ItemsControl、ListBox 控件:
3)点击 按钮,跳转到 Page2, 然后再 点击 GoBack 按钮:
回到 PivotPage 后, 滑动 ListBox 控件,就会诡异的返回到第一项。而 ListView 和 ItemsControl 没有这个问题:
另外,我怀疑,在 store app 中,ListBox 其实是作为一个 multiple ListPicker 用的,
数据绑定重点使用 ListView 和 GridView 了,个人的猜测 ....
补充:
1、针对 ListBox:
ItemsPanel 属性 默认应该是 VirtualizingStackPanel ,当返回的时候,会返回顶部:
当换为 ItemsStackPanel 时,就没问题了,导航返回后,单击不会返回顶部:
(ItemsStackPannel: MSDN)
2、 ListView 控件在做 折行布局时,如果 ListView 的ItemsPanel属性为WrapGrid 则在 Navigate back 的时候,
如果滑动列表,则会返回顶部;如果为 ItemsWrapGrid,则不会:
<ListView x:Name="lv1" ItemsSource="{Binding list}" ItemTemplate="{StaticResource template}"> <ListView.ItemsPanel> <ItemsPanelTemplate> <ItemsWrapGrid Orientation="Horizontal"/> <!-- 如果使用 <WrapGrid/> 作为容器,则出现导航回来后,返回顶部--> </ItemsPanelTemplate> </ListView.ItemsPanel> </ListView>
Demo 下载链接
Demo2 下载链接
相关文章推荐
- 关于数据绑定的一个小小的总结:绑定数据到List类型的控件(RadioButtonList,ListBox等),双重绑定。
- 第一次写的一个分页导航条控件(不包括数据绑定),高手提提意见
- C# WPF 快速开发04数据绑定、列表控件
- C#初学踩坑日记-ListBox和ComboBox数据绑定同一个DataSet的问题
- 创建一个可以绑定数据的 ASP.NET Web 部件控件
- 关于ligerUI中ligerTree代码中的一个bug,造成该控件无法通过url的POST方式加载数据
- 数据绑定技术_单值数据绑定示例;将 DataTable,DataSet,DataView,DataReader 绑定到 DataGrid 控件示例;DataBinder.Eval;数组的值赋给ListBox1;Hashtable 绑定到;RadioButtonList;将XML 文件做为数据源绑定到控件
- DropDownList ListBox GridView DataList Repeater FormView DetailsView 数据绑定控件详解
- WPF学习笔记(04) - 简单的控件和数据绑定
- 自定义控件(14)编写一个简单的数据绑定控件
- 终于解决了一个问题--如何在数据绑定时不让combox控件触发SelectedIndexChanged事件
- Demo: Dictionary>> 泛型读取XML文件数据作为数据源(DataSource)绑定到DropDownList控件 定义个一个公用类
- 数据绑定控件收藏 DropDownList ListBox GridView DataList Repeater FormView DetailsView
- 数据绑定控件收藏 DropDownList ListBox GridView DataList Repeater FormView DetailsView
- VB.Net自己写的一个控件:ComboBox下拉列表中显示多列数据(可以绑定数据表)
- winform有一个combobox和一个textbox控件,如何进行动态绑定,使得combobox中的数据改变时,textbox中的数据也随之改变?
- asp.net下的“Eval()、XPath() 和 Bind() 这类数据绑定方法只能在数据绑定控件的上下文中使用。”错误的一个可能的成因
- 终于解决了一个问题--如何在数据绑定时不让combox控件触发SelectedIndexChanged事件
- 数据传不到。BLL层,多个控件绑定了一个数据字段。
- 数据绑定控件收藏 DropDownList ListBox GridView DataList Repeater FormView DetailsView