ItemContainerGenerator.ContainerFromIndex在插入后返回null
本文关键字:返回 null 插入 ContainerFromIndex ItemContainerGenerator | 更新日期: 2023-09-27 18:08:47
我在Windows Phone应用程序中有一个ListBox
。在按钮操作中,我需要在ListBox
中的每个ListBoxItem
上设置一个名为lb
的转换和名称。
我的数据源是
var items = new ObservableCollection<string>();
for (int i = 0; i < 10; ++i)
{
items.Add("Item " + i);
}
lb.ItemsSource = items;
我有一个代码,可以在ListBox 中的每个ListBoxItem
中添加一个RenderTransform
for (int i = 0; i < items.Count;++i )
{
var item = this.lb.ItemContainerGenerator.ContainerFromIndex(i) as ListBoxItem;
item.RenderTransform = new CompositeTransform();
item.Name = i.ToString() //needed for storybord
//another stuff
}
它还可以。问题是我首先需要插入和项目到列表中。当我在for循环之前调用items.Insert(index,"test")
时,我得到一个异常,即i==index
时该项为null。当我插入新项目时,这并不重要,我总是为该项目获取null。
我做错了什么?或者在尝试访问ListBoxItem
之前,当我插入新项目时,是否有ListBox
的事件需要等待?
编辑:我提取了代码并将其放入解决方案中:https://dl.dropboxusercontent.com/u/73642/PhoneApp2.zip.我首先将一个伪项目插入到新的解决方案中,将其淡入淡出,然后使用动画将原始项目移动到该位置。
添加项后,由于UI子系统的异步特性,不会生成容器。尝试订阅ItemsChanged(或StatusChanged,对不起,我不记得了(,并在使用正确的事件参数触发事件时获取项。
等待Dispatcher完成它所做的事情,例如(由于添加了新项目而更新UI(
this.Dispatcher.BeginInvoke(() =>
{
//Code Here
});
如果您在不更新UI的情况下操作UI(例如将项目添加到列表框(,则将无法运行针对该UI的代码。
编辑:这是你的项目的代码,以获得工作
private void Button_Click(object sender, RoutedEventArgs e)
{
start = Int32.Parse(from.Text);
end = Int32.Parse(to.Text);
fake = items[start];
//items.Insert(end, fake);
this.Dispatcher.BeginInvoke(() =>
{
for (int i = 0; i < items.Count; ++i)
{
var item = this.lb.ItemContainerGenerator.ContainerFromIndex(i) as ListBoxItem;
item.Name = i.ToString();
}
(this.lb.ItemContainerGenerator.ContainerFromIndex(end) as ListBoxItem).RenderTransform = new CompositeTransform();
(this.lb.ItemContainerGenerator.ContainerFromIndex(end) as ListBoxItem).Name = "listBoxItem1";
(this.lb.ItemContainerGenerator.ContainerFromIndex(start) as ListBoxItem).Name = "listBoxItem";
sbListBox.Begin();
});
}