动态表单域的组合框应以“打开”状态启动

本文关键字:打开 状态 启动 表单 组合 动态 | 更新日期: 2023-09-27 18:17:26

我正在WPF(C#(中创建一个动态表单,其中组合框的内容用于确定下一个组合框的内容。例如,第一个组合框具有以下值:

Beers
Juices

然后,第二个组合框将是

Carlsberg
Heineken

Apple
Orange

取决于第一个组合框的值。但是,我需要第二个组合框从打开位置开始,就好像用户已经单击了它一样。我曾考虑过使用列表框来显示选项,但它确实应该是一个组合框,并且确实需要从打开位置开始。有没有办法让组合框从打开位置开始,就好像用户已经单击了它一样,以显示所有可能的选项?

谢谢!

动态表单域的组合框应以“打开”状态启动

可以通过

设置属性IsDropDownOpen以编程方式打开ComboBox。要演示这一点,请执行以下操作:

XAML:

<StackPanel>
    <ComboBox x:Name="comboBoxOne"
              SelectionChanged="OnComboBoxOneSelectionChanged" >
        <ComboBoxItem Content="Combo Box 1 - Item 1" />
        <ComboBoxItem Content="Combo Box 1 - Item 2" />
    </ComboBox>
    <ComboBox x:Name="comboBoxTwo">
        <ComboBoxItem Content="Combo Box 2 - Item 1" />
        <ComboBoxItem Content="Combo Box 2 - Item 2" />
    </ComboBox>
</StackPanel>

在代码隐藏中:

private void OnComboBoxOneSelectionChanged(object sender, SelectionChangedEventArgs e)
{
    comboBoxTwo.IsDropDownOpen = true;
}

希望这有帮助!

编辑

如果您不想使用代码隐藏,则有很多选择。例如,您可以创建附加行为或使用转换器。

例如,使用转换器:

XAML:

<StackPanel>
    <ComboBox x:Name="comboBoxOne"
              SelectionChanged="OnComboBoxOneSelectionChanged" >
        <ComboBoxItem Content="Combo Box 1 - Item 1" />
        <ComboBoxItem Content="Combo Box 1 - Item 2" />
    </ComboBox>
    <ComboBox x:Name="comboBoxTwo"
              IsDropDownOpen="{Binding ElementName=comboBoxOne, Path=SelectedItem, Mode=OneWay, Converter={l:NullToBoolConverter}}">
        <ComboBoxItem Content="Combo Box 2 - Item 1" />
        <ComboBoxItem Content="Combo Box 2 - Item 2" />
    </ComboBox>
</StackPanel>

转炉:

public class NullToBoolConverter : MarkupExtension, IValueConverter
{
    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return this;
    }
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value != null;
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

在这里 - 每次在第一个ComboBox中更改选择时,都会更新第二个Binding,并执行Converter。我正在检查 null,因为我们不希望它在启动时打开(在本例中(。

所有这些都假设您已经知道如何使用触发器动态设置ItemsSource,而真正的问题是如何让第二个ComboBox处于已经打开的状态:)