首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选择所有复选框事件处理程序

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

Stack Overflow用户
提问于 2018-03-06 13:03:56
回答 2查看 51关注 0票数 0

我在后面的代码中动态地创建一个CheckBoxes列表。这很好,但是我想添加一个初始的Select复选框。

这就是我如何创建复选框;

代码语言:javascript
复制
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);
}

这是事件处理程序;

代码语言:javascript
复制
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,但我认为我这样做的方式有点冗长。有什么更好的方法来实现这一点吗?也许没有让事件处理程序启动那么多不必要的时间。

我正在寻找的行为与它在示例这里中的工作方式是一样的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-06 15:56:07

考虑使用on鼠标向上事件,而不是on选中/on未选中的事件。

每次复选框的“被选中”值changes...regardless (用户是否启动更改或更改是否通过另一个事件完成)(如复选所有复选框自动更改该值),都会触发on选中和未选中的事件。

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

票数 1
EN

Stack Overflow用户

发布于 2018-03-06 13:12:31

因为它是WPF,所以您可以尝试:

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49131565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档