我有一种情况需要验证是否在WPF应用程序中选中了多个复选框并相应地运行代码块。对代码块的所有迭代而言,唯一改变的是文件名。示例代码如下所示
if(checkbox1.IsChecked == true)
{
Code(fileName1);
}
if(checkbox2.IsChecked == true)
{
Code(fileName2);
}
if(checkbox3.IsChecked == true)
{
Code(fileName3);
}
这看起来多余。并且我无法创建方法并将文件名和checkBox名称传递给它,因为checkBox将作为字符串传递,并且IsChecked属性对于字符串将无效。有什么方法可以克服这个问题并使代码看起来整洁?
答案 0 :(得分:3)
如果您必须以与现在相同的方式手动将复选框链接到字符串,并且只是寻找更短的代码,您可以将复选框包装到字典中,然后循环遍历它们:
var filesByCheckbox = new Dictionary<CheckBox, string> {
{ checkbox1, filename1 },
{ checkbox2, filename2 },
{ checkbox3, filename3 }
};
foreach (var kvp in filesByCheckbox)
{
if (kvp.Key.IsChecked)
{
Code(kvp.Value);
}
}
这并没有真正改善任何东西,但它只是让它更清楚哪个复选框附加到哪个文件,因此添加到列表只有一行而不是3。
如果适合你,我可能会选择坦纳的答案。
答案 1 :(得分:1)
您可以更改表单以使用CheckBox
的子类吗?如果是这样,你可以这样做:
class MyCheckBox : CheckBox
{
public string FileName { get; set; }
public void MyMethod()
{
if (IsChecked)
{
(do something with FileName);
}
}
}
然后在表单设计器中设置FileName
的值。最后,用这样的代码替换你问题中的代码:
checkbox1.MyMethod();
checkbox2.MyMethod();
checkbox3.MyMethod();
答案 2 :(得分:1)
您需要以某种方式将复选框映射到文件名。一种简单的方法是使用Tag属性:
checkbox1.Tag = filename1;
checkbox2.Tag = filename2;
checkbox3.Tag = filename3;
然后将yout复选框放入数组并处理:
var checkboxes = new [] { checkbox1, checkbox2, checkbox3 };
foreach (var checkbox in checkboxes.Where(cb => cb.IsChecked))
{
Code((string)checkbox.Tag);
}