2009-03-02 11 views
24

Ben şu (çok basit) ItemsControl:WPF - ItemsControl - ItemTemplate'de bulunan "CheckBox" öğemi nasıl bulabilirim?

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

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

Bunu nasıl yapacağım:

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

, ben aşağıdakileri yapmak istersiniz?

cevap

17

Öncelikle, bunu önlemek için herhangi bir yolu varsa yok. CheckBox'un çeşitli özelliklerini el ile çekmeye çalışmak yerine görünüm modelinize bağlamak çok daha temizdir.

size CheckBox almak gerekiyorsa, bu gibi bir kod kullanmak gerekir olabilir, dedi ki:

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

Siz efendim, güzeller! - İfadenize katılıyorum, ama bu durumda "Tümünü Kontrol Et" ve "Hiçbiri Kontrol Et" tipi fonksiyonunu yapıyorum ... Bazı dizilere bağlı "isChecked" e sahip olduğumu farkettim ve daha sonra bağlantıları yeniden güncelleyin ... ama sadece foreaching ve kontrol lazier ... demek istiyorum ... daha kolay :) Tekrar teşekkürler! –

+2

Tamam, "cevaplandı" onay kutusunu almam gerekiyordu ... çünkü sadece "NULL" alıyorum. Bunun gerçekten yakın olduğunu hayal ediyorum ama küçük bir şey eksik olmalı. –

+0

Sonunda 'FindName' yapılırken null yapmamak için ne yapılmalı? – J4N

27

OK, Kent kredi alır, ancak yalnızca çoğunlukla haklıydı:)

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

ama şöyle olması gerekiyordu bu yüzden ... ikinci bölüm, boş döneceğini:

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

Onun kodu çalışmış gibi görünüyordu, ama benim durumumda bunun yerine bunu yapmak zorundaydım.

+1

ItemTemplate üzerinde bir 'FindName' yöntemine sahip değilim (ayrıca bir tane de var gibi görünüyor)' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' – J4N

0

İşte itemscontrol en öğeyi barındıran bir kap yakalama bir örnek:

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

Bunu size yardımcı olmuştur.

İlgili konular