2009-03-02 78 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」綁定到某個數組,然後重新更新綁定...但只是foreaching和檢查是懶惰的...我的意思是...更容易:)再次感謝! – 2009-03-02 19:14:46

+2

好的,我不得不拿掉「回答」複選框......因爲我只是變得「空」。我想這真的很接近,但一定有一些小小的失蹤。 – 2009-03-02 19:46:34

27

OK,肯特得到榮譽,但它只是大多權: )

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

但是......第二部分將返回null,所以也只好如下:

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

他的代碼看起來應該有效,但對於我的情況,我不得不這樣做。

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

我希望幫助。