WPF ListBoxItem选择问题

17 *_* 26 19 wpf listbox

我有一个列表框,其中的项目包含复选框:

<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>
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,当我单击复选框或其内容时,父ListBoxItem不会被选中.如果单击复选框旁边的空白区域,则会选中ListBoxItem.

我想要获得的行为是能够在列表中选择一个或多个项目,并使用空格键来打开和关闭复选框.

更多信息:

private void Checkbox_Click(object sender, RoutedEventArgs e)
{
    CheckBox chkBox = e.OriginalSource as CheckBox;
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,当我单击一个复选框时,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>
Run Code Online (Sandbox Code Playgroud)

我必须使用PreviewKeyDown,因为默认情况下,当您点击列表框中的空格键时,它会取消选择除最近选择的项目之外的所有内容.

Ken*_*art 10

首先,将内容放在CheckBox:

<StackPanel Orientation="Horizontal">
    <CheckBox IsChecked="{Binding IsChecked}"/>
    <TextBlock Text="{Binding DisplayText}"/>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)

之后,您需要确保按下空格会ListBoxItem导致CheckBox被检查.有很多方法可以做到这一点,包括一个简单的事件处理程序ListBoxItem.或者您可以为您指定处理程序UIElement.KeyUp或其他内容DataTemplate:

<CheckBox IsChecked="{Binding IsChecked}" UIElement.KeyUp="..."/>
Run Code Online (Sandbox Code Playgroud)