Поле со списком динамических полей формы должно начинаться в открытом состоянии - PullRequest
1 голос
/ 11 декабря 2011

Я создаю динамическую форму в WPF (C #), в которой содержимое комбинированного списка используется, чтобы определить, каким будет следующий комбинированный список.Например, первый комбинированный список имеет следующие значения:

Beers
Juices

Второй комбинированный список будет тогда

Carlsberg
Heineken

или

Apple
Orange

в зависимости от значенияпервый комбобоксОднако мне нужно, чтобы второй комбинированный список запускался в позиции open , как если бы пользователь уже нажал на нее.Я рассматривал возможность использования списка для отображения вариантов, но это действительно должен быть комбинированный список, и он действительно должен начинаться в открытой позиции.Есть ли способ запустить комбинированный список в открытом положении, как если бы пользователь уже щелкнул по нему, чтобы отобразить все возможные варианты?

Спасибо!

1 Ответ

2 голосов
/ 12 декабря 2011

A ComboBox можно программно открыть, установив свойство IsDropDownOpen.Чтобы продемонстрировать это:

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 выполняется.Я проверяю ноль, так как мы не хотим, чтобы он открывался при запуске (в этом примере).

Все это предполагает, что вы уже знаете, как динамически установить ItemsSource с помощью триггеров, и этореальный вопрос в том, как получить второй ComboBox в уже открытом состоянии:)

...