2009-03-02 36 views
24

tôi có như sau (rất đơn giản) ItemsControl:WPF - ItemsControl - Làm cách nào để tìm mục "CheckBox" của tôi trong ItemTemplate?

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

Trong mã, tôi muốn làm như sau:

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

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

Làm thế nào để làm điều đó?

Trả lời

17

Thứ nhất, đừng có cách nào bạn có thể tránh được. Nó sạch hơn nhiều để ràng buộc các thuộc tính khác nhau của CheckBox cho mô hình xem của bạn thay vì cố gắng kéo chúng ra bằng tay.

Điều đó nói rằng, nếu bạn cần để có được để CheckBox của bạn, bạn có thể sẽ có thể sử dụng mã như thế này:

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

Bạn thưa bạn, rất đẹp! - Tôi đồng ý với tuyên bố của bạn, nhưng trong trường hợp này tôi đang thực hiện chức năng "Check All" và "Check None" ... Tôi nhận ra rằng tôi có thể có "isChecked" bị ràng buộc vào một số mảng, và sau đó cập nhật lại các ràng buộc ... nhưng chỉ cho phép kiểm tra và kiểm tra là lười hơn ... Ý tôi là .. dễ dàng hơn :) Cảm ơn một lần nữa! –

+2

OK, tôi đã phải lấy đi hộp kiểm "trả lời" ... bởi vì tôi chỉ nhận được "NULL". Tôi tưởng tượng điều này thực sự gần gũi, nhưng phải có một cái gì đó nhỏ mất tích. –

+0

Điều gì nên được thực hiện cuối cùng để không nhận được null khi thực hiện 'FindName'? – J4N

27

OK, Kent nhận được tín dụng, nhưng nó đã được chỉ chủ yếu phải:)

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

nhưng ... phần thứ hai sẽ trở về null, vì vậy nó phải thực hiện như sau:

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

Mã của anh ấy trông giống như nó đã làm việc, nhưng đối với trường hợp của tôi, tôi phải làm điều này để thay thế.

+1

Tôi không có phương thức 'FindName' trên ItemTemplate (cũng có vẻ như có thêm một') 'ở đâu đó? – J4N

0

Dưới đây là một ví dụ về chụp một container mà nhà hàng của ItemsControl của bạn:

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

Tôi hy vọng rằng sẽ giúp.

Các vấn đề liên quan