2010-12-30 8 views

cevap

13

Hayır, arka plan iş parçacığı kullanmaz. Kaynağı kendiniz WPF Tookit'da okuyabilirsiniz. Ancak, bir arka plan iş parçacığı üzerinde kendiniz yapmanıza izin verecek kadar esnektir.

Bu yaklaşımı kullanabilirsiniz

:

  • Populating olayı Kulp: iptal ve arka plan işçi tamamlandığında SearchText
  • kullanarak arka plan işçi başlatın: ItemsSource set ve çağrı PopulateComplete

MSDN belgelerinde bunun tam bir örneği var:

örnek otomatik tamamlama verileri doldurmak için bir asenkron web hizmeti kullanan ama aynı fikri çok büyük bir veri kümesini arama için de geçerlidir bu. Arka plan iş parçacığı

Güncelleme: İşte

arama, bir arka plan iş parçacığı üzerinde meydana ile tam bir örnektir. Uzun bir aramayı simüle etmek için bir saniyelik bir uyku içerir:

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

Teşekkürler ama bir şekilde benim için işe yaramadı. Neden tüm ItemsSource'u ve yalnızca açılır listeyi güncellemediler? – Erez

+0

Popülasyon olayını kendiniz hallederseniz, yalnızca ItemsSource'u eşleşen adaylara ayarlamanız gerekir. –

+0

Harika çözüm! –