19

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

<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 为空。

肯特的回答让我走上了正确的道路,这就是我最终得到的结果:

<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 因为默认情况下,当您在列表框中点击空格键时,它会取消选择除最近选择的项目之外的所有内容。

4

3 回答 3

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="..."/>
于 2008-09-24T14:42:04.303 回答
3

您还可以绑定 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>
于 2008-09-25T14:56:37.113 回答
3

ItemsControl在您的用例中,使用 a而不是列表框会更简单。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>

您可以单击文本以选中复选框(默认行为),您也可以使用键盘,而无需连接任何事件处理程序。

于 2011-10-19T06:12:33.180 回答