我有一个列表框,其中的项目包含复选框:
<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,因为默认情况下,当您点击列表框中的空格键时,它会取消选择除最近选择的项目之外的所有内容。
答案 0 :(得分:10)
首先,将内容放在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="..."/>
答案 1 :(得分:3)
您还可以绑定ListBoxItem的CheckBox和IsSelected属性的IsChecked属性:
<ListBox>
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox Content="{Binding DisplayText}" IsChecked="{Binding Path=IsSelected, RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
答案 2 :(得分:2)
在您的使用案例中,使用ItemsControl
而不是列表框会更简单。 ItemsControl类似于Listbox,但它不包含自动选择行为。这意味着使用它来托管一个基本上是复选框的列表非常简单,你不必解决ListBox的选择行为。
只需切换到ItemsControl就可以满足您的需求:
<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>
您可以单击文本以选中复选框(默认行为),也可以使用键盘而无需连接任何事件处理程序。