wpf - WPF ListBoxItem选择问题

标签 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>


我遇到的问题是,当我单击复选框或其内容时,父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.KeyUpDataTemplate中的任何内容指定处理程序:

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

关于wpf - WPF ListBoxItem选择问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/127556/

相关文章:

c# - 根据列表框中的选定项显示类中属性的值

c# - 隐藏ListBox控件中的垂直滚动条

wpf - WPF 不使用 Windows (pl.) for Controls 有什么影响?

c# - 使用多选从列表框中检索选定的值

c# - 在不更改所选项目的情况下聚焦 wpf 列表框

c# - 在 WPF 中加载数据时显示 Mahapps.ProgressRing

c# - 制作一个控件以沿着集合一次滑动一个图像,Windows Phone 7

wpf - 如何确定按钮是否被点击或触摸?

.net - 允许 WPF WebBrowser 中的弹出窗口

c# - 如何检查滚动条当前在 WPF DataGrid 中是否可见?