有没有一种简单的方法来设置大量的WPF Form对象?

时间:2011-03-27 17:06:21

标签: wpf xaml

这只是一个基本的例子:

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 ....方法。

2 个答案:

答案 0 :(得分:6)

有很多方法可以重构这种代码以提供更简洁的东西。选择适合每种情况的方法确实成为经验和偏好的问题。

为此,我在下面列出了几个我觉得很好的选项:

<强>装订

特别是在WPF中绑定提供了一种非常强大的方式来轻松更新表单对象。在您的Xaml中,您为每个对象应用了一个datacontext(通常用于表单/窗口)和绑定属性,然后允许您更新c#代码中的属性并使它们自动反映在表单对象中。

这样做的一大优点是可以将所有繁琐的object.Text = "xyz"代码排除在外。

在给定的示例中,您可以引入一个布尔属性TextBoxesEnabled,该属性绑定到文本框的enabled属性,并反映是否= = b。

域对象

这是从绑定方法开始的 - 在上面的示例中,看起来所有属性都只依赖于两个外部数据块(“a”和“b”)。在这种情况下,您通常只能做与您一样的事情,您需要在许多过程代码中设置UI属性。

但是,更常见的是,您可以引入具有直接映射到UI属性的属性的富有表现力的域对象。例如,您可能有一个User对象,具有Name属性,然后是一个用户窗口,其名称为文本框。

现在,您的域对象将通过调用服务层和数据访问基础架构来提供,并且由于绑定会自动显示在UI中。

代码重构

即使您需要直接设置大量属性而无法使用更具表现力的对象和绑定,通常会有一些简单的重构可以提供帮助。

在你给出的代码示例中,两个简单的重构向我跳过:

  1. a == b是布尔评估,因此您可以使用以下内容:

    bool enableTextBoxes = a == b;
    
    TextBox1.Enabled = enableTextBoxes;
    TextBox2.Enabled = enableTextBoxes;
    // etc...
    
  2. 您正在if的分支中将文本设置为相同的内容,因此请将其从if中取出并只使用一次(尽管我猜这是只是因为你提供了一些简单的示例代码。)

  3. 您可以遍历控件集合,因此如果您需要将大量控件值设置为相同的东西,您可以迭代它们并分配给每个控件。

答案 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.了解性能影响(您可能需要检查)。


另请参阅:Find Controls by Name in WPF