我有一个ListBox
在Windows Phone应用程序。 在一个按钮动作,我需要设置一个转变和名称上的每个ListBoxItem
的ListBox
称为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 。 我先插入一个假物品到新的解决方案,消除它远离,并使用动画中移动原有的项目到该位置。
等待调度来完成做什么,它做的,如(更新因为添加了新的项目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();
});
}
添加的项目之后没有因为UI子系统的异步性质所产生的容器。 请尝试订阅的ItemsChanged(或StatusChanged,对不起,我不记得了),当事件与适当的事件参数发射获得项目。