2009-03-02 16 views
24

私は、次の(非常に単純な)のItemsControlがあります。コードでWPF - ItemsControl - ItemTemplateにある "CheckBox"アイテムを見つけるにはどうすればよいですか?

<ItemsControl Name="BlahList" ItemsSource="{Binding Blah}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <CheckBox Name="MyCheckBox" Content="{Binding Text}" /> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

を、私は次の操作を実行したいと思います:

foreach (var dahCurrentItem in BlahList.Items) 
{ 
    var ItemCheckBox = BlahList.GimmeMyControl(dahCurrentItem, "MyCheckBox") 

    // I'm going to do something with the check box here... 
} 

私はそれをどのように行うのですか?

答えて

17

まず、あなたがそれを避ける方法があれば、しないでください。手動でプルアウトするのではなく、CheckBoxのさまざまなプロパティをビューモデルにバインドする方がはるかにクリーンです。あなたはCheckBoxを取得する必要がある場合、あなたはこのようなコードを使用することができるはずができ、言っ

var container = _itemsControl.ItemContainerGenerator.ContainerFromItem(dahCurrentItem) as FrameworkElement; 
var checkBox = container.FindName("MyCheckBox") as CheckBox; 
+0

あなたは、美しいです! - 私はあなたの声明に同意しますが、この場合、 "すべてチェック"と "チェックなし"タイプの機能を実行しています...私は "isChecked"をいくつかの配列にバインドして、 ...しかし、ちょうどforecheachingとチェックlazier ...私は..簡単に意味:)再びありがとう! –

+2

OK、「回答済み」のチェックボックスを外さなければなりませんでした。なぜなら「NULL」しか得られないからです。私はこれが本当に近いと思っていますが、何か小さなものがなければなりません。 –

+0

'FindName'を実行するときに最終的にnullを取得しないようにするにはどうすればよいですか? – J4N

27

OKは、ケントは、クレジットを取得しますが、それだけでほとんど正しかったです: )

// This part was good: 
var container = _itemsControl.ItemContainerGenerator.ContainerFromItem(dahCurrentItem) as FrameworkElement; 

が、次のようにしなければならなかったので...第二部は、nullを返します:

var checkBox = _itemsControl.ItemTemplate.FindName("MyCheckBox", container) as CheckBox; 

彼のコードはうまくいくはずでしたが、私の場合は代わりにこのコードを実行しなければなりませんでした。

+1

私はItemTemplate上に 'FindName'メソッドを持っていません(余分な') 'がどこかにあるようですね? – J4N

0

はここにあなたのItemsControlの項目を収容するコンテナを撮影する例を示します

 CheckBox checkbox = sender as CheckBox; 

     foreach (var item in MembersItemsControl.Items) 
     { 
      var container = 
MembersItemsControl.ItemContainerGenerator.ContainerFromItem(item) as FrameworkElement; 

      UserInformation user = container.DataContext as UserInformation; 

      bool isMale = true; 
      if (user.sex == isMale && checkbox.IsChecked.Value == true) 
      { 
       container.Visibility = System.Windows.Visibility.Visible; 
      } 
     } 

私はそれが役に立てば幸い。

関連する問題