2010-09-08 5 views
1

J'ai un exemple simple de code WinForms que j'essaye de traduire en WPF. L'idée est de changer les éléments dans un ComboBox si un certain élément est sélectionné et redescendre le ComboBox si cela se produit. Le code WinForms est:Equivalent de WinForms ComboBox.DroppedDown dans WPF

if (list.Text.Equals("C>>")) 
     { 
      comboBox1.Items.Clear(); 

      comboBox1.Items.Add("<<"); 
      comboBox1.Items.Add("C1"); 
      comboBox1.Items.Add("C2"); 
      comboBox1.Items.Add("C3"); 
      comboBox1.Items.Add("C4"); 
      comboBox1.Items.Add("C5"); 
      comboBox1.Items.Add("C6"); 
      comboBox1.DroppedDown = true; 
     } 

Bien que je pensais que ce serait tout à fait un simple changement, en utilisant

private void hotListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     if (hotListBox.SelectedItem != null) 
     { 
      if (hotListBox.SelectedItem.Equals("b >>")) 
      { 
       hotListBox.ItemsSource = secondList; 
       hotListBox.IsDropDownOpen = true; 
      } 
      else if (hotListBox.SelectedItem.Equals("<<")) 
      { 
       hotListBox.ItemsSource = initialList; 
       hotListBox.IsDropDownOpen = true; 

      } 
      else if (hotListBox.SelectedItem.Equals("d >>")) 
      { 
       hotListBox.ItemsSource = thirdList; 
       hotListBox.IsDropDownOpen = true; 

      } 
     } 
    } 

dans WPF ne semble pas fonctionner de la même manière. Je me demandais si quelqu'un savait comment faire cela?

Comme souligné dans les commentaires, je dois dire que les éléments de la ComboBox se mettent à jour comme prévu, mais ils ne redescendent pas dans le code WPF.

Cheers,

EDIT: code mis à jour

+0

Plus d'informations sur ce qui ne fonctionne pas exactement? Les nouveaux éléments ne sont-ils pas visibles dans la liste déroulante? Ne s'ouvre-t-il pas après? – Bubblewrap

+0

Les nouveaux éléments sont visibles dans la zone de liste déroulante, elle ne s'ouvre pas ensuite avec le code WPF, contrairement au code WinForms. –

Répondre

3

Modifier ceci:

hotListBox.IsDropDownOpen = true; 

à ceci:

Application.Current.Dispatcher.BeginInvoke(new Action(delegate 
{ 
    hotListBox.IsDropDownOpen = true; 
})); 
+0

A travaillé, merci - Je voudrais savoir exactement pourquoi (assez nouveau pour C# et WPF en général), je pense que c'est pour les livres que je vais! –

0

Il est probablement plus facile de changer juste la ItemSource du combobox lorsque les changements de sélection de liste.

donc créer deux listes

List<string> list1 = new List<string>() { "<<", "C1", "C2", "C3", "C4", "C5", "C6" }; 
    List<string> list2 = new List<string>() { "<<", "f", "g", "h", "i" }; 

puis il suffit de changer la source d'élément ComboBox sur la sélection de la liste changé (quelle que soit la logique dont vous avez besoin)

private void _lbTest_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    if (_lbTest.SelectedIndex == 0) 
     _comboTest.ItemsSource = list1; 
    else 
     _comboTest.ItemsSource = list2; 

    _comboTest.IsDropDownOpen = true; 
} 
+0

Bien que cela rende le code beaucoup plus net (ce qui est sympa), il ne semble pas résoudre le problème de la ComboBox ne tombe pas lorsque .IsDropDownOpen est défini :( –

+0

Vous devez poster plus de code, car il s'ouvre – mdm20

+0

Code mis à jour dans mon message original –