2013-04-12 54 views
1

我在Windows Phone应用程序中有ListBox。在按钮操作中,我需要在名为lbListBox中的每个ListBoxItem上设置转换和名称。在插入之后ItemContainerGenerator.ContainerFromIndex返回null

我的数据源是

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

我有一个代码为RenderTransform 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 
} 

添加到每个ListBoxItem,它工作正常。问题是我首先需要插入并将项目添加到列表中。当我在for循环之前调用items.Insert(index,"test")时,出现i==index时产品为空的异常。插入新项目时无关紧要,我总是为该项目获取空值。

我在做什么错?或者在我尝试访问ListBoxItem之前插入新项目时,是否需要等待ListBox的事件?

编辑:我提取了代码并将其放入一个解决方案:https://dl.dropboxusercontent.com/u/73642/PhoneApp2.zip。我首先在新解决方案中插入一个假项目,将其淡入淡出,并使用动画将原始项目移动到该位置。

+0

'我有一个代码添加一个RenderTransform到列表框中的每个ListBoxItem你应该这样做在XAML。这就是XAML的用途。在基于XAML的技术中使用过程代码来操作UI元素或它们的属性是非常令人沮丧的,并且引入了这些类型的错误以及所有类型的可维护性问题。 –

+0

我不这么认为。如何在绑定时在XAML中设置ListBoxItem的Name或RenderTransform? –

+0

你想要什么名字? 'RenderTransform'可以通过'Style TargetType =“ListBoxItem”'应用。 –

回答

-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(); 
     }); 

    } 
+0

据我所知,代码背后的代码在UI线程 –

+0

是执行,但UI尚未更新,直到代码运行并且调度程序运行之后。 – Wigen

+0

将我在for循环中沿sbListBox.Begin()方向发布的代码封装起来,观看魔法。 – Wigen

2

紧接着产品加入没有因为UI子系统的异步性的产生容器的代码。尝试订阅ItemsChanged(或StatusChanged,对不起,我不记得了),并获得项目时事件被触发与适当的事件参数。

+1

这就是答案! – Amir

+0

我遇到了同样的问题。那么,答案是什么? –

相关问题