组合框选择上的动态控制集

Dynamic Control sets on combobox selection

我有几个实例,其中用户可能需要根据组合框选择输入额外数据。必要文本框的数量会根据选择而变化(最少 1 个 - 最多 3 个)。为了使这些项目井井有条,我将它们放在 GroupBox 中。我需要的是实现这种效果的建议。我应该以编程方式将行添加到组框内的网格吗?我是否应该创建所有文本框和标签并在选择更改事件中更改可见性 属性?我不太喜欢第二个想法,因为如果只需要一个文本字段,组框将被不适当地缩放。我意识到我的问题的一般背景,作为 WPF 的新手,我只需要一些关于最佳实践的建议来实现这一点。

更新 我试图在选择更改时折叠行。这会删除内容,但仍会使我的组框保持相同大小。

 <GroupBox Name="gbCondensor" Height="Auto"  Header="Condensor"  
 FontSize="16" Grid.Column="0" Grid.Row="1" Grid.ColumnSpan="2" 
 Margin="20,0,20,92" Grid.RowSpan="2">
        <Grid Name="grdCondensor" Margin="0,10,0,0" Height="auto">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="Auto"/>
            </Grid.RowDefinitions>
            <Label x:Name="lblCondensorTemp" Grid.Column="0" Grid.Row="0" 
 Content="Condensor Temperature" HorizontalAlignment="Center"  
 VerticalAlignment="Center" Height="32" Width="255"/>
            <ComboBox Name="cmbCondensorTemp" FontSize= "16" Width="200" 
 Grid.Column="1" Grid.Row="0" VerticalAlignment="Center" 
 HorizontalAlignment="Left" Margin="10,0" Height="30">
                <ComboBoxItem IsSelected="True">Constant</ComboBoxItem>
                <ComboBoxItem>Linear</ComboBoxItem>
                <ComboBoxItem>Switching</ComboBoxItem>
            </ComboBox>
            <Label Name="lblCondensorTempText" Content="Temperature" 
 VerticalAlignment="Center" HorizontalAlignment="Right" Grid.Column="0" 
 Grid.Row="2" ></Label>
            <TextBox Name="txtCondensorTemp" Grid.Column="1" Grid.Row="2" 
Background="Gray" VerticalAlignment="Center" HorizontalAlignment="Center"  
Width="73"></TextBox>
            <Label Name="lblEndCondTemp" Content="Temperature" 
VerticalAlignment="Center" HorizontalAlignment="Right" Grid.Column="0" 
Grid.Row="3" ></Label>
            <TextBox Name="txtEndCondTemp" Grid.Column="1" Grid.Row="3" 
Background="Gray" VerticalAlignment="Center" HorizontalAlignment="Center" 
Width="73"></TextBox>
            <Label Name="lblSwitchCondTemp" Content="Temperature" 
VerticalAlignment="Center" HorizontalAlignment="Right" Grid.Column="0" 
Grid.Row="4" ></Label>
            <TextBox Name="txtSwitchCondTemp" Grid.Column="1" Grid.Row="4" 
Background="Gray" VerticalAlignment="Center" HorizontalAlignment="Center" 
Width="73"></TextBox>                
</GroupBox>

用这个折叠代码中的行:

     void CheckCondensorComboBox(object sender, SelectionChangedEventArgs e)
    {

        if (cmbCondensorTemp.SelectedIndex == 0)
        {
            lblEndCondTemp.Visibility = Visibility.Collapsed;
            txtEndCondTemp.Visibility = Visibility.Collapsed;
            grdCondensor.RowDefinitions[3].Height = new GridLength(0);
            lblSwitchCondTemp.Visibility = Visibility.Collapsed;
            txtSwitchCondTemp.Visibility = Visibility.Collapsed;
            grdCondensor.RowDefinitions[4].Height = new GridLength(0);
        }
        else if (cmbCondensorTemp.SelectedIndex == 1)
        {

            lblEndCondTemp.Visibility = Visibility.Visible;
            txtEndCondTemp.Visibility = Visibility.Visible;
            grdCondensor.RowDefinitions[3].Height = new GridLength(30);
            lblSwitchCondTemp.Visibility = Visibility.Collapsed;
            txtSwitchCondTemp.Visibility = Visibility.Collapsed;
            grdCondensor.RowDefinitions[4].Height = new GridLength(0);
        }
        else if (cmbCondensorTemp.SelectedIndex == 2)
        {
            lblEndCondTemp.Visibility = Visibility.Visible;
            txtEndCondTemp.Visibility = Visibility.Visible;
            grdCondensor.RowDefinitions[3].Height = new GridLength(30);
            lblSwitchCondTemp.Visibility = Visibility.Visible;
            txtSwitchCondTemp.Visibility = Visibility.Visible;
            grdCondensor.RowDefinitions[4].Height = new GridLength(30);
        }

    }

我在这里想要的是一个组框,它可以根据每个用户选择所需的控件更改其高度。

你的两个想法都有道理。如果没有看到代码,这个问题有点难以具体回答,但一般来说,我喜欢首先考虑可维护性——代码通常被阅读的次数比编写的次数多得多。

我怀疑简单地折叠不需要的额外字段可能比创建额外字段并在 运行 时绑定它们更直接和可维护。

尝试一种方法,看看效果如何 - 不要花太多时间权衡。