2008-09-24 9 views
18

Nerede onay kutularını öğeleri içeren bir liste vardır:WPF ListBoxItem seçim sorunu

<ListBox Style="{StaticResource CheckBoxListStyle}" Name="EditListBox"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <CheckBox Click="Checkbox_Click" IsChecked="{Binding Path=IsChecked, Mode=TwoWay}" Content="{Binding Path=DisplayText}" /> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

I having ben onay kutusu veya içeriği tıkladığımda, ebeveyn ListBoxItem seçili almaz olmasıdır. Onay kutusunun yanındaki beyaz alana tıklarsam, ListBoxItem seçili olur.

Kullanmaya çalıştığım davranış, listedeki bir veya daha fazla öğeyi seçebilmemiz ve onay kutularını açıp kapatmak için boşluk çubuğunu kullanabilmenizdir.

Biraz daha bilgi: Bir onay kutusunu tıkladığınızda Yukarıdaki kodda

private void Checkbox_Click(object sender, RoutedEventArgs e) 
{ 
    CheckBox chkBox = e.OriginalSource as CheckBox; 
} 

, e.Handled yanlıştır ve chkBox.Parent boş.

Kent'in cevabı doğru yolu beni indirdi, burada ben ile sona erdi budur: Sana bir liste kutusunda boşluk vurduğunda çünkü varsayılan olarak PreviewKeyDown kullanmak zorunda

<ListBox Style="{StaticResource CheckBoxListStyle}" Name="EditListBox" PreviewKeyDown="ListBox_PreviewKeyDown"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal"> 
       <CheckBox IsChecked="{Binding Path=IsChecked, Mode=TwoWay}" /> 
       <TextBlock Text="{Binding DisplayText}"/> 
      </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

, bu hariç her şeyi seçimini kaldırır en son seçilen öğe. Ile başlamak CheckBox dışında içerik koymak için

cevap

10

: Bundan sonra

<StackPanel Orientation="Horizontal"> 
    <CheckBox IsChecked="{Binding IsChecked}"/> 
    <TextBlock Text="{Binding DisplayText}"/> 
</StackPanel> 

, sen kontrol ediliyor CheckBox bir ListBoxItem sonuçlarına o basarak boşluk sağlamak gerekecektir. ListBoxItem'da basit bir olay işleyicisi de dahil olmak üzere bunu yapmanın çeşitli yolları vardır. Yoksa senin DataTemplate içinde UIElement.KeyUp ya da her türlü için bir işleyici belirtebilirsiniz:

<CheckBox IsChecked="{Binding IsChecked}" UIElement.KeyUp="..."/> 
3

Ayrıca ListBoxItem içinde CheckBox ve IsSelected özelliğinin IsChecked özelliği bağlayabilirsiniz: kullanımınız durumda

<ListBox> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <CheckBox Content="{Binding DisplayText}" IsChecked="{Binding Path=IsSelected, RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}}"/> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 
+1

İlk başta böyle yaptım. Hata, onay kutusu durumlarının liste kontrol seçim durumuna bağlı olması, bu da onay kutularını içeren liste denetimi için normal bir davranış olmamasıdır. –

2

o liste kutusu yerine ItemsControl kullanmak daha kolay olurdu. Bir ItemsControl, otomatik seçim davranışını içermemesi dışında bir Liste Kutusuna benzer. Bu, esas olarak onay kutularının listesini içeren bir listeyi kullanmak için kullanmanın çok basit olduğu ve ListBox'un seçim davranışını geçici olarak çözmenize gerek olmadığı anlamına gelir. Metnin tıklayabilirsiniz

<ItemsControl Style="{StaticResource CheckBoxListStyle}" Name="EditListBox"> 
    <ItemsControl .ItemTemplate> 
     <DataTemplate> 
      <CheckBox Click="Checkbox_Click" IsChecked="{Binding Path=IsChecked, Mode=TwoWay}" Content="{Binding Path=DisplayText}" /> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

onay kutularını (varsayılan davranış) kontrol etmek ve herhangi bir olay işleyicileri kadar Tel zorunda kalmadan klavyeyi de kullanabilirsiniz:

Basitçe tam olarak neye ihtiyacınız verecek ItemsControl geçiş .