WPF ListBox带有复选框:在勾选之前先选择复选框

5

问题:

我有一个列表框,在该列表框中有复选框。在第一次点击时,复选框被选择并选中。在第二次点击时,复选框仅被设置。可以使用箭头键重新选择不同的复选框。我的目标是,先选中复选框,然后再勾选它(再次点击),从而省去箭头键。

目标:

  • 第一次点击时选择项目
  • 第二次点击时选中复选框

代码:

<ListBox Name="Terminals" ItemsSource="{Binding AllTerminals, Mode=OneWay}" IsSynchronizedWithCurrentItem="True">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <CheckBox Content="{Binding Description}" Foreground="{Binding DisplayColor}"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
1个回答

7
通过将IsHitTestVisible属性绑定到ListBoxItem的选择状态,禁用CheckBox上的点击注册:
<ListBox Name="Terminals" ItemsSource="{Binding AllTerminals, Mode=OneWay}" IsSynchronizedWithCurrentItem="True">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <CheckBox Content="{Binding Description}" 
                      IsHitTestVisible="{Binding Path=IsSelected, RelativeSource={RelativeSource AncestorType=ListBoxItem}}"
                      Foreground="{Binding DisplayColor}"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

这样,第一次点击只会选择ListBoxItem,第二次点击才能选中/取消复选框。
在向ListBox添加项目后,视觉树如下:
ListBox
 --ListBoxItem
   --CheckBox
 --ListBoxItem
   --CheckBox
 --ListBoxItem
   --CheckBox

当用户点击ListBoxItem时,它会被选中(IsSelected=true)。当用户点击CheckBox时,它会被勾选或取消勾选。但是,如果设置了 IsHitTestVisible 为false,则元素的点击事件将不会被注册。由于勾选/取消勾选应仅在所选项目上工作,因此我们可以创建 CheckBox.IsHitTestVisible 和父 ListBoxItem.IsSelected 之间的绑定,以实现此效果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接