这只是一个基本的例子:
if (a == b)
{
textBox1.Text = "a == b";
textBox1.IsEnabled = true;
textBox2.Text = "EXAMPLE2";
textBox2.IsEnabled = false;
textBox3.Text = "EXAMPLE3";
textBox3.IsEnabled = false;
textBox4.Text = "EXAMPLE4";
textBox4.IsEnabled = false;
textBox5.Text = "EXAMPLE5";
textBox5.IsEnabled = false;
}
else
{
textBox1.Text = "a != b";
textBox1.IsEnabled = false;
textBox2.Text = "EXAMPLE2";
textBox2.IsEnabled = true;
textBox3.Text = "EXAMPLE3";
textBox3.IsEnabled = true;
textBox4.Text = "EXAMPLE4";
textBox4.IsEnabled = true;
textBox5.Text = "EXAMPLE5";
textBox5.IsEnabled = true;
}
这看起来很乏味。我想知道是否有更好的方法来处理这样的情况?我只是觉得所有的Pros都没有使用这个1x1x1x ....方法。
答案 0 :(得分:6)
有很多方法可以重构这种代码以提供更简洁的东西。选择适合每种情况的方法确实成为经验和偏好的问题。
为此,我在下面列出了几个我觉得很好的选项:
<强>装订强>
特别是在WPF中绑定提供了一种非常强大的方式来轻松更新表单对象。在您的Xaml中,您为每个对象应用了一个datacontext(通常用于表单/窗口)和绑定属性,然后允许您更新c#代码中的属性并使它们自动反映在表单对象中。
这样做的一大优点是可以将所有繁琐的object.Text = "xyz"
代码排除在外。
在给定的示例中,您可以引入一个布尔属性TextBoxesEnabled
,该属性绑定到文本框的enabled属性,并反映是否= = b。
域对象
这是从绑定方法开始的 - 在上面的示例中,看起来所有属性都只依赖于两个外部数据块(“a”和“b”)。在这种情况下,您通常只能做与您一样的事情,您需要在许多过程代码中设置UI属性。
但是,更常见的是,您可以引入具有直接映射到UI属性的属性的富有表现力的域对象。例如,您可能有一个User
对象,具有Name
属性,然后是一个用户窗口,其名称为文本框。
现在,您的域对象将通过调用服务层和数据访问基础架构来提供,并且由于绑定会自动显示在UI中。
代码重构
即使您需要直接设置大量属性而无法使用更具表现力的对象和绑定,通常会有一些简单的重构可以提供帮助。
在你给出的代码示例中,两个简单的重构向我跳过:
a == b
是布尔评估,因此您可以使用以下内容:
bool enableTextBoxes = a == b;
TextBox1.Enabled = enableTextBoxes;
TextBox2.Enabled = enableTextBoxes;
// etc...
您正在if
的分支中将文本设置为相同的内容,因此请将其从if
中取出并只使用一次(尽管我猜这是只是因为你提供了一些简单的示例代码。)
您可以遍历控件集合,因此如果您需要将大量控件值设置为相同的东西,您可以迭代它们并分配给每个控件。
答案 1 :(得分:1)
假设:
1.你的控件有一个模式myControl1,myControl2等(例如textBox1,textBox2等)
2.您的控件都是同一FrameworkElement
个父级的所有子级(例如,所有这些都在Grid
内)
bool shouldEnable = (a == b); //or whatever logic you want to have to decide the enable/disable value
for(i=0; i<10; i++)
{
string myControlName = "textBox" + i.ToString(); //assuming your pattern to be textBox1, textBox2, etc.
object myControl = myGrid.FindName(myControlName); //assuming your textboxes present in a Grid named "myGrid"
if(myControl is TextBox) //assuming your controls to be TextBoxes
{
TextBox myTextBox = (TextBox)myControl;
myTextBox.IsEnabled = shouldEnable;
myTextBox.Text = "whatever you want based on your logic";
}
}
请记住:
1.在MSDN上引用FindName:FrameworkElement.FindName
2.如果您的所有控件都不在父母一方之下,您可能需要查看:How can I find WPF controls by name or type?
3.了解性能影响(您可能需要检查)。