我在后面的代码中动态地创建一个CheckBoxes列表。这很好,但是我想添加一个初始的Select复选框。
这就是我如何创建复选框;
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,但我认为我这样做的方式有点冗长。有什么更好的方法来实现这一点吗?也许没有让事件处理程序启动那么多不必要的时间。
我正在寻找的行为与它在示例这里中的工作方式是一样的。
发布于 2018-03-06 15:56:07
考虑使用on鼠标向上事件,而不是on选中/on未选中的事件。
每次复选框的“被选中”值changes...regardless (用户是否启动更改或更改是否通过另一个事件完成)(如复选所有复选框自动更改该值),都会触发on选中和未选中的事件。
如果您使用鼠标up事件,则不会不必要地执行此代码。
发布于 2018-03-06 13:12:31
因为它是WPF,所以您可以尝试:
在创建特殊复选框时,还可以使用主复选框为选中的属性定义绑定,以便在选中/未选中时,相应的子复选框将反映相同的内容。
https://stackoverflow.com/questions/49131565
复制相似问题