2011-01-02 15 views
0

Ich benutze AutoCompleteBox aus dem WPF-Toolkit und ich implementieren die Bestückung von meinem eigenen , da es eine Menge Daten gibt und ich die Suche in einem Hintergrund-Thread tun möchte.Autocomplete mit BackgroundWorker funktioniert nicht

das ist heppans, wenn ich nach der nummer 12 suche. während es mir zeigen sollte 4 ergebnisse - 12,120,121,122.

Was mache ich falsch?

Guide auf Msdn, die ich versucht Folow: http://msdn.microsoft.com/en-us/library/system.windows.controls.autocompletebox.populating(VS.95).aspx

alt text

XAML:

<Grid> 
    <Controls:AutoCompleteBox x:Name="txtSearch" Populating="AutoCompleteBox_Populating" Height="30" Background="Beige" /> 
</Grid> 

-Code hinter:

public partial class Window1 : Window { 

    private int MAX_NUM_OF_RESULTS = 3; 

    public List<Person> Persons { get; set; } 
    public List<string> Results { get; set; } 

    public Window1() { 
     InitializeComponent(); 

     Persons = new List<Person>(); 
     for (var i = 0; i < 1000000; i++) { 
      Persons.Add(new Person { Name = i.ToString() }); 
     } 

     Results = new List<string>(); 
    } 

    private void AutoCompleteBox_Populating(object sender, PopulatingEventArgs e) { 

     e.Cancel = true; 

     var b = new BackgroundWorker(); 
     b.RunWorkerAsync(txtSearch.SearchText); 
     b.DoWork += b_DoWork; 
     b.RunWorkerCompleted += b_RunWorkerCompleted; 
    } 

    void b_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { 
     txtSearch.ItemsSource = Results; 
     txtSearch.PopulateComplete(); 
    } 


    void b_DoWork(object sender, DoWorkEventArgs e) { 

     Results.Clear(); 
     var counter = 0; 

     foreach (var person in Persons) { 
      if (person.Name.StartsWith(e.Argument.ToString())) { 
       Results.Add(person.Name); 
       counter++; 

       if (counter > MAX_NUM_OF_RESULTS) { 
        break; 
       } 
      } 
     } 
    } 
} 

Klasse Person:

public class Person { 
    public string Name; 
} 

Antwort

1

Sind Sie sicher, dass Ihre Suchlogik tatsächlich ausgeführt wird? Wenn ja, sind die erwarteten Ergebnisse in den Ergebnissen, bevor sie ItemsSource zugewiesen werden?

Ich denke, das:

var b = new BackgroundWorker(); 
    b.RunWorkerAsync(txtSearch.SearchText); 
    b.DoWork += b_DoWork; 
    b.RunWorkerCompleted += b_RunWorkerCompleted; 

dies sein sollte:

var b = new BackgroundWorker(); 
    b.DoWork += b_DoWork; 
    b.RunWorkerCompleted += b_RunWorkerCompleted; 
    b.RunWorkerAsync(txtSearch.SearchText); 

Andernfalls riskieren Sie den Arbeiter Start mit vor Ereignishandler einrichten.

4

Versuchen Sie den Auftrag an den folgenden

ändern
var b = new BackgroundWorker(); 
b.DoWork += b_DoWork; 
b.RunWorkerCompleted += b_RunWorkerCompleted; 
b.RunWorkerAsync(txtSearch.SearchText);