2009-02-03 6 views
1

J'essaie d'implémenter un comportement similaire à Firefox 3 AwesomeBar dans WPF. J'ai un ComboBox pour utiliser un DataTemplate qui fait que la liste déroulante ressemble à la liste déroulante pour l'AwesomeBar, mais je ne suis pas sûr de savoir comment obtenir le bon comportement. Ce que je veux arriver, c'est que l'utilisateur tape sa recherche dans le bit TextBox de la ComboBox et ensuite affine progressivement les résultats dans la liste déroulante. Je pense que je peux probablement obtenir l'interrogation de la base de données (car les résultats proviendront de la base de données), mais ce que je veux obtenir, c'est que le bit descendant s'ouvre dès que l'utilisateur commence à taper (comme dans Firefox) 3) puis le premier élément de la liste à sélectionner automatiquement et les autres éléments de la liste pour pouvoir être sélectionnés en utilisant les touches fléchées ou en cliquant dessus.FF3 Comportement AwesomeBar dans WPF

Mise à jour:

J'ai maintenant trouvé le chemin programmatique pour obtenir le ComboBox de descendre (en utilisant IsDropDownOpen = true) mais j'ai encore quelques autres problèmes:

Tout d'abord quand je tape quelque chose, il tombe mais il ne sélectionne pas la correspondance la plus proche de ce que je tape, et deuxièmement quand je tape quelque chose qui sélectionne de façon unique un élément, il ferme automatiquement et exécute la méthode SelectedItemChanged. Je ne veux que fermer et exécuter le code lorsque j'ai cliqué dessus ou appuyé sur Entrée (plutôt que d'avoir la sélection en utilisant les flèches haut et bas). Des idées comment l'obtenir pour faire ce que je veux? Je peux donner plus d'informations si ce n'est pas assez clair.

Répondre

3

La plupart des fonctionnalités que vous souhaitez sont déjà dans la ComboBox.

Existe-t-il un moyen de programmer la liste déroulante de la liste ComboBox?

Oui, vous pouvez le faire en définissant la propriété ComboBox.IsDropDownOpen à vrai.

Et est-il possible de sélectionner un élément sans fermer la liste et devenir l'élément sélectionné?

Lorsque vous définissez IsEditable à vrai, il sélectionnera le premier élément qui correspond au texte saisi pour vous - lorsque vous déposez vers le bas l'élément sera toujours sélectionné. Cet exemple ne fonctionne pas le filtrage d'un ensemble de données plus grande, mais il devrait vous aider à démarrer:

<Grid xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:sys="clr-namespace:System;assembly=mscorlib" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Grid.Resources> 
     <x:Array x:Key="data" Type="{x:Type sys:String}"> 
      <sys:String>Veni</sys:String> 
      <sys:String>Vidi</sys:String> 
      <sys:String>Vici</sys:String> 
     </x:Array> 
    </Grid.Resources> 
    <ComboBox x:Name="myCombo" ItemsSource="{StaticResource data}" IsEditable="True" PreviewTextInput="myCombo_PreviewTextInput"/> 
</Grid> 

Dans le code derrière nous ouvrons la ComboBox. Votre gestionnaire peut également effectuer le filtrage ici:

private void myCombo_PreviewTextInput(object sender, TextCompositionEventArgs e) 
{ 
    myCombo.IsDropDownOpen = true; 
} 
+0

Thanks.I » J'ai essayé ça, mais ça ne semble pas tomber lorsque je tape quelque chose qui est assez unique pour sélectionner un élément directement. En outre, cela ne fonctionne que pour sélectionner les éléments qui commencent par les caractères que vous tapez - je voudrais le faire rechercher dans toute la chaîne. Des idées pour changer cela? – robintw

0

Utilisez un CollectionView pour accéder à votre collection.

ListCollectionView _myCollectionView = new ListCollectionView(someCollection); 

Liez votre zone de liste déroulante à cette CollectionView. Ce que cela fournira est un mécanisme de filtre. Implémentez une méthode de filtrage (SearchText dans ce code serait votre texte ComboBox ...Je le stocker dans un DP appelé SearchText et le mettre à jour à partir de la zone de liste déroulante):

private bool FilterMethod(string expression) 
{ 

    if (expression != null && this.SearchText != null) 
    { 
      if (expression.ToUpper().Contains(this.SearchText.ToUpper())) 
       return true; 

      else 
       return false; 
    } 

    return true; 
} 

Maintenant, quand les types d'utilisateurs quelque chose, utilisez cette méthode de filtrage sur le CollectionView:

_myCollectionView.Filter = new Predicate<string>(FilterMethod); 
Questions connexes