listBox获取其listBoxItem的问题

玖伍叁柒 2010-12-10 11:35:09
我在xaml里面有
<ListBox x:Name="inviteList" Height="440" FontSize="20" LayoutUpdated="inviteList_LayoutUpdated" SelectionMode="Multiple">
<ListBox.DataContext>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock x:Name="inviteListTextShow" Margin="5,5,5,5" VerticalAlignment="Bottom" Width="300" FontSize="25" Padding="0,5,0,0" Height="40">
</TextBlock>
<TextBlock x:Name="hadInviteShow" Margin="5,5,5,5" VerticalAlignment="Bottom" Width="160" FontSize="25" Padding="0,5,0,0" TextAlignment="Center" Height="40">
</TextBlock>
</StackPanel>
</DataTemplate>
</ListBox.DataContext>
</ListBox>


然后在代码里面有:


private void inviteList_LayoutUpdated(object sender, EventArgs e)
{
for (int i = 0; i < inviteList.Items.Count; ++i)//此处inviteList已经有插入600项内容,inviteList.Items.Count == 600
{
ListBoxItem listItem = inviteList.ItemContainerGenerator.ContainerFromIndex(i) as ListBoxItem;
TextBlock name = FindFirstVisualChild<TextBlock>(listItem, "inviteListTextShow");
TextBlock hadInvite = FindFirstVisualChild<TextBlock>(listItem, "hadInviteShow");
if (null != name && null != hadInvite)
{
//.......
}
}
inviteListUpdataOnce = false;
}


红字的那句每当i > 40的时候,inviteList.ItemContainerGenerator.ContainerFromIndex(i) 就只能返回null,也就是说listbox只能拿到其前40项的listBoxItem。

这个是什么问题呢? 求高手指点一二。。。。

能解决问题,再加100分。。。
...全文
498 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
passself 2010-12-14
  • 打赏
  • 举报
回复
建议显示多少条,就遍历多少条,不要全部遍历,这样耗资源,也影响性能
jv9 2010-12-14
  • 打赏
  • 举报
回复
对于大数据量操作,你使用的ItemContainerGenerator.ContainerFromIndex性能不是很好,推荐遍历所有items,然后通过循环对item进行条件搜索。
玖伍叁柒 2010-12-14
  • 打赏
  • 举报
回复
其实我也想用绑定的,但是刚开始学这个,不知道怎么绑定数据上去,就像7楼说的,自己写一个类来实现绑定,但是写完类后怎么绑定,这个就不知道了。

哎,不过这个问题还是解决了,直接重写了下toString()总算是让listbox显示了我想要的东西。

结贴学数据绑定去。
helloWorld1209 2010-12-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 rush2 的回复:]
引用 3 楼 jimmy_xiao0010 的回复:

你想实现的功能是什么? 一次把所有的items遍历出来之后做什么?



遍历出来后可以给两个textBlock的text赋值啊,然后列表不就显示了我想要的东西。

不知道还有别的什么方法?
[/Quote]

那你为什么不采取第一次直接绑定的方法呢,直接初始化把所有的控件赋值,

需要构建一个类就可以 比如:

class DataSource

{
Public List<A> AList { get; set;}
public string B {get;set;}
}
leon0905 2010-12-13
  • 打赏
  • 举报
回复
不知LZ为什么不用绑定的方式来呈现,而要用目前这种方式
玖伍叁柒 2010-12-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jimmy_xiao0010 的回复:]

你想实现的功能是什么? 一次把所有的items遍历出来之后做什么?
[/Quote]


遍历出来后可以给两个textBlock的text赋值啊,然后列表不就显示了我想要的东西。

不知道还有别的什么方法?
玖伍叁柒 2010-12-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jimmy_xiao0010 的回复:]

知道原因了。

为什么我到第6个null,是因为我的listbox默认高度正好可以显示6个items 就是0-5,所以之后的就是null

然后我把listbox拉到最下面 当前显示最后6个items 就是595-599 这个时候第0个索引时null,而595-599索引不是null。

所以说ItemContainerGenerator.ContainerFromIndex(i)也……
[/Quote]

我试了下,也不是一页有多少索引就能拿到多少个,我一页只有8个索引,但是一次最多能拿到40个items,但是确实是和当前显示的索引位置有关的。

但是怎么样才能把所有的索引项都更新掉呢?
helloWorld1209 2010-12-10
  • 打赏
  • 举报
回复
你想实现的功能是什么? 一次把所有的items遍历出来之后做什么?
helloWorld1209 2010-12-10
  • 打赏
  • 举报
回复
知道原因了。

为什么我到第6个null,是因为我的listbox默认高度正好可以显示6个items 就是0-5,所以之后的就是null

然后我把listbox拉到最下面 当前显示最后6个items 就是595-599 这个时候第0个索引时null,而595-599索引不是null。

所以说ItemContainerGenerator.ContainerFromIndex(i)也许是只能找到页面中当前显示的item,而不是真正实现遍历所有的items
helloWorld1209 2010-12-10
  • 打赏
  • 举报
回复
试了一下,我600个数据到第6个就是null了。。。

8,737

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧