WPF ListBoxItem选择问题
时间:2020-03-06 14:39:58 来源:igfitidea点击:
我有一个列表框,其中的项目包含复选框:
<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>
我遇到的问题是,当我单击复选框或者其内容时,父ListBoxItem未被选中。如果我单击复选框旁边的空白,则ListBoxItem确实会被选中。
我试图获得的行为是能够选择列表中的一个或者多个项目,并使用空格键来打开或者关闭复选框。
更多信息:
private void Checkbox_Click(object sender, RoutedEventArgs e) { CheckBox chkBox = e.OriginalSource as CheckBox; }
在上面的代码中,当我单击一个复选框时,e.Handled为false,而chkBox.Parent为null。
肯特的答案使我走上了正确的道路,这就是我最终得到的结果:
<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>
我必须使用PreviewKeyDown,因为默认情况下,当我们在列表框中单击空格键时,它将取消选择除最近选择的项目以外的所有内容。
解决方案
首先,将内容放在CheckBox
之外:
<StackPanel Orientation="Horizontal"> <CheckBox IsChecked="{Binding IsChecked}"/> <TextBlock Text="{Binding DisplayText}"/> </StackPanel>
之后,我们将需要确保在ListBoxItem上按空格会导致CheckBox被检查。有许多方法可以做到这一点,包括在ListBoxItem上使用一个简单的事件处理程序。或者,我们可以为UIElement.KeyUp或者在DataTemplate中的任何内容指定处理程序:
<CheckBox IsChecked="{Binding IsChecked}" UIElement.KeyUp="..."/>
我们还可以绑定CheckBox的IsChecked属性和ListBoxItem的IsSelected属性:
<ListBox> <ListBox.ItemTemplate> <DataTemplate> <CheckBox Content="{Binding DisplayText}" IsChecked="{Binding Path=IsSelected, RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}}"/> </DataTemplate> </ListBox.ItemTemplate> </ListBox>