代码之家  ›  专栏  ›  技术社区  ›  17 of 26

WPF ListBoxItem选择问题

  •  19
  • 17 of 26  · 技术社区  · 16 年前

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

    我试图获得的行为是能够在列表中选择一个或多个项目,并使用空格键切换复选框的开和关。

    更多信息:

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

    3 回复  |  直到 16 年前
        1
  •  10
  •   Tim Cooper    13 年前

    首先,将内容放在 CheckBox :

    <StackPanel Orientation="Horizontal">
        <CheckBox IsChecked="{Binding IsChecked}"/>
        <TextBlock Text="{Binding DisplayText}"/>
    </StackPanel>
    

    ListBoxItem 结果 复选框 . 或者您可以为指定一个处理程序 UIElement.KeyUp 或是你脑子里的任何东西 DataTemplate :

    <CheckBox IsChecked="{Binding IsChecked}" UIElement.KeyUp="..."/>
    
        2
  •  3
  •   Vassili Altynikov    16 年前

    您还可以绑定复选框的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>
    
        3
  •  3
  •   Patrick Klug    12 年前

    ItemsControl 而不是列表框。ItemsControl与Listbox类似,只是它不包含自动选择行为。这意味着使用它来托管一个基本上是复选框的列表非常简单,并且您不必绕过列表框的选择行为。

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

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