2009-06-16 11 views

答えて

41

セブのに似ていますが、おそらくより良い性能を持つソリューション:

for(int i = 0; i < itemsControl.Items.Count; i++) 
{ 
    UIElement uiElement = 
     (UIElement)itemsControl.ItemContainerGenerator.ContainerFromIndex(i); 
} 
+0

+1、感謝しても簡単ですが私の問題を解決しました –

+0

レンダリングされた/まだ示されているが、それはいかなるアイテムも持たない。 – Maslow

0

私はItemsControl.Items[index]が動作しないと仮定していますか?

私は面白くないし、自分自身をチェックしていない - それはちょうど私の最初の推測です。ほとんどの場合、データバインドされていても、コントロールにはアイテムのインデクサープロパティがあります。

+2

これはdoesnの " 「子」要素(コントロール)を取得し、リストの項目のみを検索します。リストの項目は、必ずしもコントロールではありません。 –

+1

いいえ、データソースとデータテンプレートを使用している場合は、データテンプレートで使用する文字列のロードでは、アイテムとして返された文字列を取得します。 –

+0

十分です。私はあなたのコメントが役に立つかもしれないので私の答えを残しておきます。 –

-2

ItemsControl.Itemsプロパティを使用します。

foreach (var item in itemsControl1.Items) 
{ 
    Console.WriteLine(item.ToString()); 
} 
+0

コメントを繰り返すには、データソースとデータテンプレートを使用するとします(例:データテンプレートで使用する文字列の負荷、あなたは、 –

+0

アイテムとして返された文字列を取得します。その後、あなたはSebのソリューションと一緒に行くべき – Oskar

19

を参照してください。これはあなたを助けている場合:

foreach(var item in itemsControl.Items) 
{ 
    UIElement uiElement = 
     (UIElement)itemsControl.ItemContainerGenerator.ContainerFromItem(item); 
} 

を制御し、UIElementで論理項目間の違いがあります。

9

ItemsControl識別するには年代に(ToggleButtonのような)データ・バインド子コントロールを、あなたがこれを使用することができます。

for (int i = 0; i < yourItemsControl.Items.Count; i++) 
{ 

    ContentPresenter c = (ContentPresenter)yourItemsControl.ItemContainerGenerator.ContainerFromItem(yourItemsControl.Items[i]); 
    ToggleButton tb = c.ContentTemplate.FindName("btnYourButtonName", c) as ToggleButton; 

    if (tb.IsChecked.Value) 
    { 
     //do stuff 

    } 
} 
+0

'FindName()'を呼び出す前に 'c.ApplyTemplate();'を呼び出す必要があります。そうでない場合はnullを返します。 – Karmacon

+0

@Karmaconは 'c.ApplyTemplate();'なしでうまく動作します... – rumblefx0

関連する問題