选择所有复选框事件处理程序

时间:2018-03-06 13:03:56

标签: wpf checkbox

我在后面的代码中动态创建一个CheckBoxes列表。这工作正常,但我想添加一个初始[全选]复选框。

这就是我创建复选框的方式;

var splCheckBoxes = new StackPanel();
var ckb = new CheckBox
{
    Content = "[Select All]",
    Margin = new Thickness(40, 0, 0, 0),
    IsChecked = true
};
ckb.Checked += CkbSelectAllChecked;
ckb.Unchecked += CkbSelectAllChecked;
splCheckBoxes.Children.Add(ckb);

var distinctValues = [LIST OF VALUES TO POPULATE INTO CHECKBOXES];

foreach (var distinctValue in distinctValues)
{
    ckb = new CheckBox
    {
        Content = distinctValue,
        Margin = new Thickness(40, 0, 0, 0)
    };
    if (string.IsNullOrEmpty(distinctValue))
        ckb.Content = "[BLANK]";
    ckb.IsChecked = true;
    ckb.Checked += CkbOnChecked;
    ckb.Unchecked += CkbOnChecked;
    splCheckBoxes.Children.Add(ckb);
}

这是事件处理程序;

private void CkbOnChecked(object sender, RoutedEventArgs routedEventArgs)
{
    var senderCbx = ((CheckBox)sender);
    if (!senderCbx.IsChecked.Value)
    {
        var selectAllCbx = ((StackPanel)senderCbx.Parent).Children.OfType<CheckBox>().FirstOrDefault(x => x.Content.ToString() == "[Select All]");
        selectAllCbx.IsChecked = false;
    }
    ...DoProcessingBasedOnUpdatedCheckboxes();
}

private void CkbSelectAllChecked(object sender, RoutedEventArgs routedEventArgs)
{
    var senderCbx = ((CheckBox)sender);

    var checkBoxes = ((StackPanel)senderCbx.Parent).Children.OfType<CheckBox>();
    checkBoxes = checkBoxes as CheckBox[] ?? checkBoxes.ToArray();
    var willCheck = checkBoxes.FirstOrDefault().IsChecked.Value;
    foreach (var checkBox in checkBoxes)
    {
        if (checkBox.Content.ToString() != "[Select All]")
            checkBox.IsChecked = willCheck;
    }
}

我相信只有在DoProcessingBasedOnUpdatedCheckboxes完成后将bool设置为true时才运行CkbSelectAllChecked,我才能做到这一点,但我认为我这样做的方式有点啰嗦。有什么建议可以更好地实现这一目标吗?也许没有让事件处理程序开始这么多不必要的时间。

我正在寻找的行为与示例here中的行为相同。

2 个答案:

答案 0 :(得分:1)

考虑使用on mouse up事件而不是on checked / on unchecked事件。

每次复选框的“已选中”值更改时,都会触发on checked和unchecked事件...无论用户是否启动了更改,或者是否通过其他事件完成了更改(如check all复选框)自动更改了值。)

如果您使用鼠标按键事件,则不会不必要地执行此代码。

答案 1 :(得分:0)

既然它是WPF,你可以尝试:

在创建特殊复选框时,您还可以使用main复选框为checked属性定义绑定,以便在选中/取消选中时,相应的子复选框将反映相同的内容。