I am using a RadAutoCompleteBox to list/select an assigned user to an object. The data is unbound and the itemssource is generated by polling an Active Directory tree. When an item is selected, the value is stored in the property of the datacontext as the principal's SID. My problem is that when I later access the object, I cannot set the SelectedItem of the RadAutoCompleteBox to one of the principals in the list and I have to resort to setting the SearchText which still pops up the suggested values when the control receives focus. I would like to be able to set the SelectedItem instead so this does not happen.
In the Page.xaml
In the Page.xaml.vb
And the custom filter
Finally, the code where I populate the the list and attempted to preselect an item based on the datacontext
Is it possible to set SelectedItem in some way? Would binding SelectedItem to the property allow it to display automatically when the datacontext changes? What I have works but I would like a consistant experience for my user where the suggested items do not pop up when the value has been set previously.
Thanks,
Jason
In the Page.xaml
<
telerik:RadAutoCompleteBox
x:Name
=
"PrincipalAutoCompleteBox"
WatermarkContent
=
"Select a principal"
TextSearchMode
=
"Contains"
AutoCompleteMode
=
"SuggestAppend"
SelectionMode
=
"Single"
TextSearchPath
=
"Name"
DropDownItemTemplate
=
"{StaticResource ResourceKey=DSPrincipalAutoComplete}"
DropDownWidth
=
"Auto"
FilteringBehavior
=
"{StaticResource ResourceKey=CustomFilteringBehaviour}"
GotFocus
=
"PrincipalAutoCompleteBox_GotFocus"
KeyDown
=
"PrincipalAutoCompleteBox_KeyDown"
Populated
=
"PrincipalAutoCompleteBox_Populated"
/>
In the Page.xaml.vb
Private
Sub
PrincipalAutoCompleteBox_GotFocus(sender
As
System.
Object
, e
As
System.Windows.RoutedEventArgs)
Dim
autoComplete
As
RadAutoCompleteBox =
DirectCast
(sender, RadAutoCompleteBox)
Dim
searchString
As
String
= autoComplete.SearchText
If
autoComplete.SelectedItem IsNot
Nothing
Then
searchString = BindingExpressionHelper.GetValue(autoComplete.SelectedItem, autoComplete.DisplayMemberPath).ToString()
End
If
autoComplete.IsDropDownOpen =
False
autoComplete.Populate(searchString)
End
Sub
Private
lastFilteredItems
As
IEnumerable(Of
Object
)
Private
Sub
PrincipalAutoCompleteBox_KeyDown(sender
As
System.
Object
, e
As
System.Windows.Input.KeyEventArgs)
Dim
autoCompleteBox
As
RadAutoCompleteBox =
DirectCast
(sender, RadAutoCompleteBox)
If
e.Key = Key.Tab
AndAlso
e.Handled =
False
AndAlso
autoCompleteBox.SelectedItem
Is
Nothing
Then
If
lastFilteredItems.Count = 1
Then
autoCompleteBox.SelectedItem = lastFilteredItems.OfType(Of
Object
).FirstOrDefault
Else
autoCompleteBox.SearchText =
Nothing
End
If
End
If
End
Sub
Private
Sub
PrincipalAutoCompleteBox_Populated(sender
As
System.
Object
, e
As
System.EventArgs)
Me
.lastFilteredItems =
DirectCast
(sender, RadAutoCompleteBox).FilteredItems
End
Sub
And the custom filter
Public
Class
CustomFilteringBehaviour
Inherits
Telerik.Windows.Controls.FilteringBehavior
Public
Overrides
Function
FindMatchingItems(searchText
As
String
, items
As
System.Collections.IList, escapedItems
As
System.Collections.Generic.IEnumerable(Of
Object
), textSearchPath
As
String
, textSearchMode
As
Telerik.Windows.Controls.TextSearchMode)
As
System.Collections.Generic.IEnumerable(Of
Object
)
If
String
.IsNullOrEmpty(searchText)
Then
Return
items.OfType(Of
Object
).Where(
Function
(x)
Not
escapedItems.Contains(x))
Else
Return
MyBase
.FindMatchingItems(searchText, items, escapedItems, textSearchPath, textSearchMode)
End
If
End
Function
End
Class
Finally, the code where I populate the the list and attempted to preselect an item based on the datacontext
'^-- principalList As ObservableCollection(Of DSPrincipal) and then populated from AD
PrincipalAutoCompleteBox.ItemsSource = principalList
For
Each
principal
As
DSPrincipal
In
principalList
If
principal.Sid =
DirectCast
(
Me
.DataContext, MyObject).Principal.SID
Then
'v-- What I tried to do but it threw an error
'PrincipalAutoCompleteBox.SelectedItem = principal
'v-- What I ended up doing
PrincipalAutoCompleteBox.SearchText = _principal.Name
Exit
For
End
If
Next
Is it possible to set SelectedItem in some way? Would binding SelectedItem to the property allow it to display automatically when the datacontext changes? What I have works but I would like a consistant experience for my user where the suggested items do not pop up when the value has been set previously.
Thanks,
Jason