2012-03-27 6 views
2

選択(チェック)されているアイテムに基づいて新しいListBoxを作成する必要があります。次のコードは、ListBoxに20項目しかない場合に実際に機能しましたが、項目を追加するとクラッシュします。誰かがそれを働かせる方法、または異なる方法を知ることができますか? listBoxをループする機能がありますか?WP7 - すべてのListBoxアイテムをループするVisualTreeHelper

// worked fine for 20 items, 
    // but my actual list contems 95 items... 
    private void btnCreateNewList_Click(object sender, RoutedEventArgs e) 
    { 

       int totalItemsCB = ListCheckBoxVocabulary.Items.Count; 
       for (int ii = 0; ii < totalItemsCB-1; ii++) 
       { 
        ListBoxItem item = this.ListCheckBoxVocabulary.ItemContainerGenerator.ContainerFromIndex(ii) as ListBoxItem; 
        CheckBox thisCheckBox = FindFirstElementInVisualTree<CheckBox>(item); 
        if (thisCheckBox.IsChecked == true) 
        { 

         dataPlayListSource.Add(new SampleData() { Text = thisCheckBox.Content.ToString() + " | " + ii }); 
         // this.PlayListCheckBoxVocabulary.UpdateLayout(); 
         this.PlayListCheckBoxVocabulary.ItemsSource = dataPlayListSource; 
        } 

       } 
    } 

    private T FindFirstElementInVisualTree<T>(DependencyObject parentElement) where T : DependencyObject 
    { 
     var count = VisualTreeHelper.GetChildrenCount(parentElement); 
     if (count == 0) 
      return null; 

     for (int i = 0; i < count; i++) 
     { 
      var child = VisualTreeHelper.GetChild(parentElement, i); 

      if (child != null && child is T) 
      { 
       return (T)child; 
      } 
      else 
      { 
       var result = FindFirstElementInVisualTree<T>(child); 
       if (result != null) 
        return result; 

      } 
     } 
     return null; 
    } 

とXAML:

 <controls:PivotItem Header="Vocabulary" > 
      <ListBox x:Name="ListCheckBoxVocabulary" Margin="0,0,-12,0" ItemsSource="{Binding Items}"> 
       <ListBox.ItemTemplate> 
        <DataTemplate> 
         <!--<StackPanel Margin="0,0,0,17" Width="432">--> 
         <CheckBox x:Name="cbVocabulary" Content="{Binding Text}" Checked="CheckBox_Checked" Unchecked="UncheckBox" /> 
         <!--</StackPanel>--> 
        </DataTemplate> 
       </ListBox.ItemTemplate> 
      </ListBox> 
     </controls:PivotItem> 
+0

例外はありますか? – earthling

+0

こんにちは,,私は次を取得しています:参照は、行に有効な視覚的なDependencyObjectではありません。var count = VisualTreeHelper.GetChildrenCount(parentElement);しかし、私が同じリストに少ないアイテムを持っていたら、それは通り抜けます... –

答えて

1

リストバーチャルである - それらが必要と潜在的に(と思う)に再利用されているなどのコントロールが作成されます。

ListBoxを仮想化しないでください(テンプレートを無効にし、SerializedStackPanelの代わりにコンテナの場合はStackPanelを選択してください)。

あなたの他の(そして好ましい)オプションは、データバインディングによるチェックです。ほとんどの状況で、より簡単で迅速な方法。

+0

あなたの応答に感謝しますが、私はデータバインディングを介してチェックを行うことができますか?あなたは、新しいリストボックスにクリックされたアイテムを追加するような意味ですか?あなたがリストボックスを更新するにはどうすればいいですか?まだ混乱しています... –

+0

ListBoxに{Items}をバインドしています - 各Itemにそれがチェックされているかどうかを示すブール値、Checkbox {IsChecked}依存関係プロパティにバインドして、本質的に "機能する" –

+0

この記事を見つけて問題を回避しようとしました:** ListBoxItemsが破棄されました** ContainerFromItem()とContainerFromIndex()はListBoxItemsが存在しないのでnullを返します。これは明らかにメモリ/パフォーマンスです( http://stackoverflow.com/questions/211971/scroll-wpf私はいくつかの項目でそれをテストすれば、それは完璧に動作するので、私のコードに起こっていることです。 –

関連する問題