Die AutoCompleteBox ist aktuell nur per Silverligth Toolkit zu erhältlich. D.h. im Standard von SIlverlight nicht enthalten. Bei meinen Recherchen im Web fand ich wie üblich unzählige Beispiele die entweder nicht funktionierten oder meine Anforderung nicht abdecken. Das liegt u.a. daran das das Silverlight Toolkit sehr kurze Development Zyklen hat und auch ständig Funktionsänderungen unterliegt.
Konkret will ich eine komplexe Liste an die AutoCompleteBox binden um z.B. die Popup Darstellung per Datagrid zu erledigen.
Meine Zielplattform ist hier Silverlight 4 es sollte aber in Silverlight 3 identsein, da das Toolkit auf dem gleichen Build basiert.
<input:AutoCompleteBox
x:Name="txtFaxnummer"
IsTextCompletionEnabled="True"
ValueMemberBinding="{Binding AName}"
FilterMode="Contains"
Height="55" VerticalAlignment="Top" d:LayoutOverrides="VerticalAlignment" FontSize="29.333">
<input:AutoCompleteBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<ContentPresenter Content="{Binding Path=AName}" />
</StackPanel>
</DataTemplate>
</input:AutoCompleteBox.ItemTemplate>
</input:AutoCompleteBox>
Mit dem Attribut TextCompletionEnabled wird der gesuchte Text automatisch ergänzt. Das ValueMemberBinding bindet letztendlich das eigentliche Property aus der Liste an die Eingabe. Für die Anzeige benötigt man in diesem Fall eine Itemtemplate. Bei einfachen Listen wie z. B. String Arrays geht das einfacher. Der eigentliche Clou liegt im Filtermode. Hier wird per Contains LINQ ähnlich definiert wie die Suche in der Liste erfolgen soll.
Die zuweisung der Daten Liste erfolgt per Code z.B. im Page_loaded Event. Um das Filtern in den Daten indivduell zu ermöglichen kann man eine Funktion dem ItemFIlter zuweisen. In meinen Tests hat das Ohne auch gar nicht funktioniert.
Autocompletebox1.ItemsSource = Liste
Autocompletebox1.ItemFilter = AddressOf MyFilter
Dann noch der Inhalt der Filter Funktion
Private Function MyFilter(ByVal search As String, ByVal item As Object) As Boolean
Dim lst As Liste = TryCast(item, Liste)
If lst IsNot Nothing Then
Dim filter As String = search.ToUpper()
Return (lst.AName.ToUpper().Contains(filter) _
OrElse lst.Nummer.ToUpper().Contains(filter))
End If
Return False
End Function
Silverlight 4, Beta, Silverligth Toolkit November 2009, Visual Studio 2010 Beta 2