我在后面的代码中动态创建一个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中的行为相同。
答案 0 :(得分:1)
考虑使用on mouse up事件而不是on checked / on unchecked事件。
每次复选框的“已选中”值更改时,都会触发on checked和unchecked事件...无论用户是否启动了更改,或者是否通过其他事件完成了更改(如check all复选框)自动更改了值。)
如果您使用鼠标按键事件,则不会不必要地执行此代码。
答案 1 :(得分:0)
既然它是WPF,你可以尝试:
在创建特殊复选框时,您还可以使用main复选框为checked属性定义绑定,以便在选中/取消选中时,相应的子复选框将反映相同的内容。