Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
动态C#方法还是多If-else-If块?_C#_Wpf - Fatal编程技术网

动态C#方法还是多If-else-If块?

动态C#方法还是多If-else-If块?,c#,wpf,C#,Wpf,在这种情况下,我需要验证WPF应用程序中是否选中了多个复选框,并相应地运行代码块。随着代码块的所有迭代,唯一改变的是文件名。示例代码如下所示 if(checkbox1.IsChecked == true) { Code(fileName1); } if(checkbox2.IsChecked == true) { Code(fileName2); } if(checkbox3.IsChecked == true) { Code(fileName3); } 这一切看起来

在这种情况下,我需要验证WPF应用程序中是否选中了多个复选框,并相应地运行代码块。随着代码块的所有迭代,唯一改变的是文件名。示例代码如下所示

if(checkbox1.IsChecked == true)
{
    Code(fileName1);
}
if(checkbox2.IsChecked == true)
{
    Code(fileName2);
}
if(checkbox3.IsChecked == true)
{
    Code(fileName3);
} 

这一切看起来都是多余的。我无法创建方法并将文件名和复选框名传递给它,因为复选框将作为字符串传递,而IsChecked属性对于字符串无效。有什么方法可以克服这个问题并使代码看起来整洁吗?

您可以将表单更改为使用
复选框的子类吗?如果是这样,您可以这样做:

class MyCheckBox : CheckBox
{
    public string FileName { get; set; }

    public void MyMethod()
    {
        if (IsChecked)
        {
            (do something with FileName);
        }
    }
}
然后在表单设计器中设置
FileName
的值。最后,将问题中的代码替换为以下内容:

checkbox1.MyMethod();
checkbox2.MyMethod();
checkbox3.MyMethod();

能否将表单更改为使用
复选框的子类?如果是这样,您可以这样做:

class MyCheckBox : CheckBox
{
    public string FileName { get; set; }

    public void MyMethod()
    {
        if (IsChecked)
        {
            (do something with FileName);
        }
    }
}
然后在表单设计器中设置
FileName
的值。最后,将问题中的代码替换为以下内容:

checkbox1.MyMethod();
checkbox2.MyMethod();
checkbox3.MyMethod();

如果您必须以与现在相同的方式手动将复选框链接到字符串,并且只查找较短的代码,则可以将复选框包装到字典中,然后循环遍历它们:

var filesByCheckbox = new Dictionary<CheckBox, string> {
    { checkbox1, filename1 },
    { checkbox2, filename2 },
    { checkbox3, filename3 }
};

foreach (var kvp in filesByCheckbox)
{
    if (kvp.Key.IsChecked)
    {
        Code(kvp.Value);
    }
}
var filesByCheckbox=新建字典{
{checkbox1,filename1},
{checkbox2,filename2},
{checkbox3,filename3}
};
foreach(filesByCheckbox中的var kvp)
{
如果(kvp.Key.IsChecked)
{
代码(kvp.值);
}
}
这并没有真正改善任何东西,但它只是让它更清楚地显示哪个复选框附加到哪个文件,所以添加到列表中只需一行,而不是3行


如果Tanner的答案对您有效,我可能会同意。

如果您必须以与现在相同的方式手动将复选框链接到字符串,并且只需要寻找较短的代码,您可以将复选框包装到字典中,然后循环:

var filesByCheckbox = new Dictionary<CheckBox, string> {
    { checkbox1, filename1 },
    { checkbox2, filename2 },
    { checkbox3, filename3 }
};

foreach (var kvp in filesByCheckbox)
{
    if (kvp.Key.IsChecked)
    {
        Code(kvp.Value);
    }
}
var filesByCheckbox=新建字典{
{checkbox1,filename1},
{checkbox2,filename2},
{checkbox3,filename3}
};
foreach(filesByCheckbox中的var kvp)
{
如果(kvp.Key.IsChecked)
{
代码(kvp.值);
}
}
这并没有真正改善任何东西,但它只是让它更清楚地显示哪个复选框附加到哪个文件,所以添加到列表中只需一行,而不是3行


如果Tanner的答案对您有效,我可能会同意。

您需要以某种方式将复选框映射到文件名。一种简单的方法是使用标记属性:

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);
}

您需要以某种方式将复选框映射到文件名。一种简单的方法是使用标记属性:

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);
}

当你说
something==true
时,它与
something
相同。它通常使它更具可读性。但是,即使我将if(checkbox1.IsChecked==true)更改为if(checkbox1.IsChecked),它仍然会抛出相同的错误,不是吗?是的,它们是等价的语句,只是一个可读性问题。如果仍然会执行
code(filename)
,只需使用逻辑更改文件名并避免编写“code”多次。当你说
something==true
时,它与
something
相同。它通常使它更具可读性。但是,即使我将if(checkbox1.IsChecked==true)更改为if(checkbox1.IsChecked),它仍然会抛出相同的错误,不是吗?是的,它们是等价的语句,只是可读性问题。如果仍将执行
code(filename)
,只需使用逻辑更改文件名并避免多次编写“code”。看起来这样就可以了。我会尝试一下,然后向你汇报。我是C#的初学者,我试着从你提出的解决方案开始。我创建了一个新类CustomCheckBox,并使用CustomCheckBox:CheckBox从CheckBox继承。理想情况下,CustomCheckBox应该复制CheckBox的所有属性,不是吗?当我更新我的XAML并用CustomCheckBox替换CheckBox时,它抛出了一个错误,并表示WPF项目中不支持CustomCheckBox。为什么会发生这种情况?CheckBox和CustomCheckBox是相似的对象,对吗?不幸的是,我不熟悉WPF,所以我不知道答案。本页可能会帮助您:但是,使用Joe Enos的解决方案(或者您在实现Joe的解决方案时想到的想法——我认为这是一个好主意)可能会更容易。通过创建一个接受复选框作为参数的方法,实现了我的目标。谢谢你的时间。看起来这样就可以了。我会尝试一下,然后向你汇报。我是C#的初学者,我试着从你提出的解决方案开始。我创建了一个新类CustomCheckBox,并使用CustomCheckBox:CheckBox从CheckBox继承。理想情况下,CustomCheckBox应该复制CheckBox的所有属性,不是吗?当我更新我的XAML并用CustomCheckBox替换CheckBox时,它抛出了一个错误,并表示WPF项目中不支持CustomCheckBox。为什么会发生这种情况?CheckBox和CustomCheckBox是相似的对象,对吗?不幸的是,我不熟悉WPF,所以我不知道答案。本页可能会帮助您:但是,使用Joe Enos的解决方案(或者您在实现Joe的解决方案时想到的想法——我认为这是一个好主意)可能会更容易。通过创建一个接受复选框作为参数的方法,实现了我的目标。谢谢你的时间。当我实施你的解决方案时,我有了另一个想法。为什么不创建一个执行所有活动的方法,并将CheckBox类型的对象作为参数传递给该方法?这很有道理。不是吗?当我实施你的解决方案时,我有了另一个想法。为什么不创建一个执行所有活动的方法,并将CheckBox类型的对象作为参数传递给该方法?这很有道理。不是吗?