ItemContainerGenerator.ContainerFromIndex插入后返回null

2019-10-18 00:42发布

我有一个ListBox在Windows Phone应用程序。 在一个按钮动作,我需要设置一个转变和名称上的每个ListBoxItemListBox称为lb

我的数据源是

var items = new ObservableCollection<string>();
for (int i = 0; i < 10; ++i)
{
    items.Add("Item " + i);
}
lb.ItemsSource = items;

我有一个代码,一个添加RenderTransform每个ListBoxItem ListBox中的

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
}

和它的作品确定。 问题是,我首先需要插入和项目到列表中。 当我打电话items.Insert(index,"test")前的for循环,我得到一个例外,该项目为空时, i==index 。 不要紧,当我插入新项目,我总是得到空该项目。

我究竟做错了什么? 或者是那里的事件ListBox ,我需要等待当我插入试图存取权限的新前项ListBoxItem

编辑 :我提取的代码,并把它变成一个解决方案: https://dl.dropboxusercontent.com/u/73642/PhoneApp2.zip 。 我先插入一个假物品到新的解决方案,消除它远离,并使用动画中移动原有的项目到该位置。

Answer 1:

等待调度来完成做什么,它做的,如(更新因为添加了新的项目UI)

this.Dispatcher.BeginInvoke(() =>
{
   //Code Here
});

如果你操作的用户界面,例如添加一个项目没有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();
        });

    }


Answer 2:

添加的项目之后没有因为UI子系统的异步性质所产生的容器。 请尝试订阅的ItemsChanged(或StatusChanged,对不起,我不记得了),当事件与适当的事件参数发射获得项目。



文章来源: ItemContainerGenerator.ContainerFromIndex returns null after Insert