2010-12-30 12 views
8

मैं WPF टूलकिट ऑटोकंपलेटबॉक्स का उपयोग कर रहा हूं कि इसकी वस्तुएं स्रोत वस्तुओं के लाखों की एक सूची है।Wpf टूलकिट पृष्ठभूमि पूर्णांक पर ऑटोकंपलेटबॉक्स खोज

क्या ऑटोकंपलेटबॉक्स पृष्ठभूमि पृष्ठभूमि को खोजने के लिए उपयोग करता है और यदि यह नहीं करता है तो मैं इसे कैसे बना सकता हूं।

उत्तर

13

नहीं, यह पृष्ठभूमि धागे का उपयोग नहीं करता है। आप स्रोत को WPF Tookit में पढ़ सकते हैं। हालांकि, यह आपको पृष्ठभूमि थ्रेड पर स्वयं करने की अनुमति देने के लिए पर्याप्त लचीला है।

आप इस दृष्टिकोण का उपयोग कर सकते हैं:

  • संभाल Populating घटना: इसे रद्द, और SearchText
  • का उपयोग करते समय पृष्ठभूमि कार्यकर्ता पूरा हो गया है अपनी पृष्ठभूमि कार्यकर्ता शुरू: ItemsSource सेट और फोन PopulateComplete

एमएसडीएन दस्तावेज में इसका एक पूरा उदाहरण है:

उदाहरण स्वत: पूर्ण डेटा को भरने के लिए एक अतुल्यकालिक वेब सेवा का उपयोग करता है, लेकिन एक ही विचार एक बहुत बड़ी डाटासेट खोज के लिए लागू होता है। पृष्ठभूमि धागा

अद्यतन:

यहाँ एक पृष्ठभूमि धागे पर खोज होने वाली के साथ एक पूर्ण उदाहरण है। इसमें लंबी खोज को अनुकरण करने के लिए एक-दूसरी नींद शामिल है:

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

धन्यवाद लेकिन किसी भी तरह से यह मेरे लिए काम नहीं करता है। उन्होंने पूरे आइटम स्रोत को क्यों अपडेट किया और न केवल ड्रॉप-डाउन सूची? – Erez

+0

यदि आप पॉप्युलेटिंग ईवेंट को स्वयं संभालते हैं तो आपको केवल उन आइटम्ससोर्स को सेट करने की आवश्यकता है जो मेल खाते हैं। –

+0

ग्रेट सॉल्यूशन! –

संबंधित मुद्दे