带有Checkbox的XAML列表框,选中复选框bevor检查它

时间:2017-03-01 08:04:22

标签: wpf xaml

问题
我有一个Listbox,Listbox是Checkboxes。在第一次单击时,选中并选中复选框。在第二次单击时,仅设置复选框。可以使用箭头键重新选择不同的复选框。我的目标是,首先选中复选框,然后再选中(再次单击它),从而无需使用箭头键。

目标

  • 首次点击选择项目
  • 第二次点击检查复选框

守则

<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 个答案:

答案 0 :(得分:5)

通过将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,则不会注册click元素。由于check / uncheck仅适用于所选项目,因此我们可以在CheckBox.IsHitTestVisible和父ListBoxItem.IsSelected之间创建绑定以实现此类效果