2010-12-30 31 views

Trả lời

13

Không, nó không sử dụng chuỗi nền. Bạn có thể tự mình đọc nguồn trong số WPF Tookit. Tuy nhiên, nó đủ linh hoạt để cho phép bạn tự làm điều đó trên một chuỗi nền.

Bạn có thể sử dụng phương pháp này:

  • Xử lý sự kiện Populating: hủy bỏ nó, và bắt đầu công nhân nền của bạn sử dụng SearchText
  • Khi người lao động nền hoàn tất: thiết lập các ItemsSource và gọi PopulateComplete

Có một ví dụ hoàn chỉnh về điều này trong tài liệu MSDN:

Đó dụ sử dụng một dịch vụ web không đồng bộ để cư dữ liệu tự động hoàn tất nhưng ý tưởng tương tự áp dụng cho việc tìm kiếm một tập dữ liệu rất lớn. Các sợi nền

Cập nhật:

Dưới đây là một ví dụ hoàn chỉnh với việc tìm kiếm xảy ra trên một sợi nền. Nó bao gồm một giấc ngủ một giây để mô phỏng một tìm kiếm dài:

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

Cảm ơn nhưng bằng cách nào đó nó đã không làm việc cho tôi. Tại sao họ cập nhật toàn bộ ItemsSource và không chỉ danh sách thả xuống? – Erez

+0

Nếu bạn xử lý sự kiện populating mình, bạn chỉ cần đặt ItemsSource cho các ứng viên phù hợp. –

+0

Giải pháp tuyệt vời! –

Các vấn đề liên quan