locked
Falsches SelectedItem bei der AutoCompleteBox RRS feed

  • Frage

  • Hallo,

    ich habe ein Problem mit der AutoCompleteBox aus dem Silverlight-Toolkit vom März 2009 für Silverligtht 2. Ich möchte in der Textbox eine ID eingeben und es sollen in der dropDownList alle Einträge mit den zugehörigen weiteren Eigenschaften des Datensatzes dieser ID angezeigt werden. Ich habe für diesen Beitrag dazu mal ein kleines Demo extrahiert. Soweit funtioniert das auch:


    Dazu der XAML-Code:
    <controls:AutoCompleteBox x:Name="Autocomplete_Single" Populating="AutoCompleteBox_Populating" SearchMode="None" IsTextCompletionEnabled="True"  
    
    
    
                                     Height="30" Width="100" Margin="10,10,0,0" KeyUp="Autocomplete_Single_KeyUp">
    
    
    
                <controls:AutoCompleteBox.ItemTemplate>
    
    
    
                    <DataTemplate>
    
    
    
                        <StackPanel Orientation="Horizontal" Margin="10,0,0,0">
    
    
    
                            <TextBlock FontWeight="Bold" Width="80" HorizontalAlignment="Center" FontSize="12" Text="{Binding Mode=OneWay, Path=Name}"/>
    
    
    
                            <TextBlock TextWrapping="Wrap" Width="80" Text="{Binding Mode=OneWay, Path=ValueKindID}" FontSize="12"/>
    
    
    
                        </StackPanel>
    
    
    
                    </DataTemplate>
    
    
    
                </controls:AutoCompleteBox.ItemTemplate>
    
    
    
            </controls:AutoCompleteBox>
    
    
    
    
    und der Codebehind:
     private void AutoCompleteBox_Populating(object sender, PopulatingEventArgs e)
    
    
    
            {
    
    
    
                e.Cancel = true;
    
    
    
                int ValueKindID = int.Parse(e.Parameter);
    
    
    
    
    
    
    
                FillAutocompleteListByValueKindID(ValueKindID);
    
    
    
                Binding binding = new Binding();
    
    
    
                binding.Path = new PropertyPath("ValueKindID");
    
    
    
    
    
    
    
                Autocomplete_Single.ValueMemberBinding = binding;
    
    
    
    
    
    
    
            }
    
    
    
    
    
    
    
            private void FillAutocompleteListByValueKindID(int ValueKindID)
    
    
    
            {
    
    
    
                // Create some Demo-data, in oringin-Project will be called a WCF-Service here
    
    
    
                WorkbookEntry wbe1 = new WorkbookEntry { ID = 1, Name = "Name1", ValueKindID = 20 };
    
    
    
                WorkbookEntry wbe2 = new WorkbookEntry { ID = 2, Name = "Name2", ValueKindID = 20 };
    
    
    
                WorkbookEntry wbe3 = new WorkbookEntry { ID = 3, Name = "Name3", ValueKindID = 20 };
    
    
    
                WorkbookEntry wbe4 = new WorkbookEntry { ID = 4, Name = "Name4", ValueKindID = 20 };
    
    
    
                WorkbookEntry wbe5 = new WorkbookEntry { ID = 5, Name = "Name5", ValueKindID = 22 };
    
    
    
                WorkbookEntry wbe6 = new WorkbookEntry { ID = 6, Name = "Name6", ValueKindID = 22 };
    
    
    
                WorkbookEntry wbe7 = new WorkbookEntry { ID = 7, Name = "Name7", ValueKindID = 22 };
    
    
    
                WorkbookEntry wbe8 = new WorkbookEntry { ID = 8, Name = "Name8", ValueKindID = 22 };
    
    
    
    
    
    
    
                var itemList = new List<WorkbookEntry> { wbe1, wbe2, wbe3, wbe4, wbe5, wbe6, wbe7, wbe8 };
    
    
    
    
    
    
    
                Autocomplete_Single.ItemsSource = itemList.Where(w => w.ValueKindID.Equals(ValueKindID));
    
    
    
                Autocomplete_Single.PopulateComplete();
    
    
    
            }
    
    
    
    
    
    
    
            private void Autocomplete_Single_KeyUp(object sender, KeyEventArgs e)
    
    
    
            {
    
    
    
                if (e.Key == Key.Enter)
    
    
    
                {
    
    
    
    
    
    
    
                }
    
    
    
            }
    
    
    
    
    Nun das Problem: Da das für die Filterung der AutoCompleteBox relevante Feld der "ID" bei mehreren Datensätzen den selben Wert haben kann (hier die 22), enthält das SelectedItem stets das erste Object der Liste, auch wenn z.B. der 3. wert ausgewählt wurde.

    Also ich wähle "Name7" aus:
     

    selectedItem enthält jedoch das Objekt mit "Name5":

     

    Wie kann ich das Problem lösen?

    Danke, Marcel
    • Bearbeitet msiggi Mittwoch, 22. April 2009 08:59
    Mittwoch, 22. April 2009 06:59

Antworten

  • Bist Du sicher, dass das SelectedItem zu diesem Zeitpunkt bereits gesetzt sein sollte?
    Hast Du das Problem z.B. auch bei Auswertung in SelectionChanged?
    Mittwoch, 22. April 2009 08:37
  • Hallo Marcel,

    ich vermute, die Lösung liegt in der Verarbeitungsreihenfolge der Events der AutoCompleteBox. Ich werde Dein Projekt am WE mal in VB.NET übersetzen und nach einer Lösung suchen. (Schreibe leider kein C#).

    Beste Grüße,
    M.
    Freitag, 7. August 2009 06:53
  • Hallo Marcel,

    Schau Dir mal an folgender Link, vielleicht kann er Dir weiterhelfen.

    AutoComplete für Silverlight TextBoxen: http://www.nikhilk.net/Silverlight-AutoComplete.aspx


    Grüße,

    Robert

    Mittwoch, 19. August 2009 11:56

Alle Antworten

  • Bist Du sicher, dass das SelectedItem zu diesem Zeitpunkt bereits gesetzt sein sollte?
    Hast Du das Problem z.B. auch bei Auswertung in SelectionChanged?
    Mittwoch, 22. April 2009 08:37
  • Wenn ich mich per Cursortasten durch die Liste bewege, enthält das SelectedItem beim SelectionChanged-Event stets das korrekte Objekt. Drücke ich Enter, hat das SelectedItem auch im SelectionChanged wieder den falschen Wert. Habe ich hier irgendwie ein Blackout?

    Ich habe das Projekt mal hier hochgeladen.

    Mittwoch, 22. April 2009 08:57
  • Hallo Marcel,

    ich vermute, die Lösung liegt in der Verarbeitungsreihenfolge der Events der AutoCompleteBox. Ich werde Dein Projekt am WE mal in VB.NET übersetzen und nach einer Lösung suchen. (Schreibe leider kein C#).

    Beste Grüße,
    M.
    Freitag, 7. August 2009 06:53
  • Hallo Marcel,

    Schau Dir mal an folgender Link, vielleicht kann er Dir weiterhelfen.

    AutoComplete für Silverlight TextBoxen: http://www.nikhilk.net/Silverlight-AutoComplete.aspx


    Grüße,

    Robert

    Mittwoch, 19. August 2009 11:56
  • Hallo Marcel,

    Ich gehe davon aus, dass die Antworten Dir weitergeholfen haben.

    Grüße,
    Robert

    Donnerstag, 20. August 2009 14:53
  • Hallo Robert,

    danke für den Link-Tipp, ich schau mir das mal an!

    Marcel
    Freitag, 21. August 2009 06:48