2013-04-12 52 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

我遇到了同樣的問題。那麼,答案是什麼? –

相關問題