2010-12-30 3 views

Répondre

13

Non, il n'utilise pas de thread d'arrière-plan. Vous pouvez lire la source vous-même dans le WPF Tookit. Cependant, il est assez flexible pour vous permettre de le faire vous-même sur un fil de fond.

Vous pouvez utiliser cette approche:

  • gérer l'événement Populating: l'annuler et commencer votre travailleur de fond en utilisant SearchText
  • Lorsque le travailleur de fond est terminée: définir la ItemsSource et appelez PopulateComplete

Il existe un exemple complet dans la documentation MSDN:

Cet exemple utilise un service Web asynchrone pour remplir les données auto-complet, mais la même idée s'applique à la recherche d'un ensemble de données très volumineux. Le fil de fond

Mise à jour:

Voici un exemple avec la recherche se produisant sur un fil d'arrière-plan. Il comprend un sommeil d'une seconde pour simuler une longue recherche:

private class PopulateInfo 
{ 
    public AutoCompleteBox AutoCompleteBox { get; set; } 
    public string SearchText { get; set; } 
    public IEnumerable<string> Results { get; set; } 
} 

private void AutoCompleteBox_Populating(object sender, PopulatingEventArgs e) 
{ 
    var populateInfo = new PopulateInfo 
    { 
     AutoCompleteBox = sender as AutoCompleteBox, 
     SearchText = (sender as AutoCompleteBox).SearchText, 
    }; 
    e.Cancel = true; 
    var ui = TaskScheduler.FromCurrentSynchronizationContext(); 
    var populate = Task.Factory.StartNew<PopulateInfo>(() => Populate(populateInfo)); 
    populate.ContinueWith(task => OnPopulateComplete(task.Result), ui); 
} 

private PopulateInfo Populate(PopulateInfo populateInfo) 
{ 
    var candidates = new string[] { 
     "Abc", 
     "Def", 
     "Ghi", 
    }; 
    populateInfo.Results = candidates 
     .Where(candidate => candidate.StartsWith(populateInfo.SearchText, StringComparison.InvariantCultureIgnoreCase)) 
     .ToList(); 
    Thread.Sleep(1000); 
    return populateInfo; 
} 

private void OnPopulateComplete(PopulateInfo populateInfo) 
{ 
    if (populateInfo.SearchText == populateInfo.AutoCompleteBox.SearchText) 
    { 
     populateInfo.AutoCompleteBox.ItemsSource = populateInfo.Results; 
     populateInfo.AutoCompleteBox.PopulateComplete(); 
    } 
} 
+0

Merci, mais d'une manière ou d'une autre cela n'a pas fonctionné pour moi. Pourquoi ont-ils mis à jour la totalité de ItemsSource et pas seulement la liste déroulante? – Erez

+0

Si vous gérez vous-même l'événement de remplissage, vous n'avez qu'à définir la source Items pour les candidats correspondants. –

+0

Excellente solution! –