2011-12-11 44 views
1

我在WPF(C#)中創建一個動態表單,其中組合框的內容用於確定下一個組合框的內容。例如,第一組合框具有這些值:然後動態表單域的組合框應該以「打開」狀態開始

Beers 
Juices 

第二組合框將或者

Carlsberg 
Heineken 

Apple 
Orange 

取決於第一組合框的值。但是,我需要第二個組合框在開放的位置開始,就好像用戶已經點擊了它。我曾考慮使用列表框來顯示選項,但它確實應該是一個組合框,它確實需要從開放位置開始。有沒有辦法讓組合框在打開位置開始,就好像用戶已經點擊了它一樣,以顯示所有可能的選項?

謝謝!

+0

看看HTTP第二ComboBox:// stackoverflow.com/questions/4327012/wpf-cascading-comboboxes-dependent-ones-dont-update –

+0

@pratapchandra:雖然當然充滿了有用的信息,但這個問題與這個問題無關。爲了澄清,組合框僅在用戶點擊它之後才顯示其初始狀態中的所有選項。然而,在我當前項目的獨特約束條件下,當組合框動態添加時(就像你鏈接到的問題一樣),所有選項都會顯示('打開'狀態),就好像用戶點擊了一樣在上面。 – dotancohen

回答

2

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(); 
    } 
} 

這裏 - 每次在第一ComboBoxBinding在第二選擇的變化被更新,並執行Converter。我檢查null,因爲我們不希望它在啓動時打開(在本例中)。

所有這一切都假定你已經知道如何設置ItemsSource動態使用觸發器,而真正的問題是如何讓一個已經打開的狀態:)

+0

謝謝!這是一個非常詳細和完整的答案。我非常感謝你的協助。 – dotancohen

相關問題