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.我首先将一个伪项目插入到新的解决方案中,将其淡入淡出,然后使用动画将原始项目移动到该位置。

ItemContainerGenerator.ContainerFromIndex在插入后返回null

添加项后,由于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();
        });
    }