Hi,
I have several comboboxes whose itemssource is bound to a common list of strings, when the list changes I raise a propertychanged event. In some circumstances some of the comboboxes display all of the strings and some do not. However the ones not showing all the strings do still find them for autocomplete purposes..
I have several comboboxes whose itemssource is bound to a common list of strings, when the list changes I raise a propertychanged event. In some circumstances some of the comboboxes display all of the strings and some do not. However the ones not showing all the strings do still find them for autocomplete purposes..
4 Answers, 1 is accepted
0
Trevor
Top achievements
Rank 1
answered on 25 Mar 2011, 01:06 PM
Watching the person who is repoducing this, it only happens when they click on the down selector to see if an entry exists and then start typing straight away without any more mouse clicks (as the focus is already in the edit portion of the combo). Now that I know how to cause this I will try in debug with binding tracing on.
0
Trevor
Top achievements
Rank 1
answered on 25 Mar 2011, 05:26 PM
I have created a simple example that demonstrates our problem:
Entering a new text value into one of the combos without extending the dropdown then pressing comit works fine, you can do this repeatedly and then when you open the combo you see your new entries listed. Once you have done this however no futher entries are added to the list.
It is as though the list is 'locked' by being displayed - could this be due to an optimization of some kind? Is there any way to force a re-evaluation of what should be rendered? The binding is still working as auto-complete picks up the new entries even though they are not displayed..
thanks
xaml
code behind
Entering a new text value into one of the combos without extending the dropdown then pressing comit works fine, you can do this repeatedly and then when you open the combo you see your new entries listed. Once you have done this however no futher entries are added to the list.
It is as though the list is 'locked' by being displayed - could this be due to an optimization of some kind? Is there any way to force a re-evaluation of what should be rendered? The binding is still working as auto-complete picks up the new entries even though they are not displayed..
thanks
xaml
<
Window
x:Class
=
"TestCombos.Window1"
xmlns:Controls
=
"clr-namespace:Telerik.Windows.Controls;assembly=Telerik.Windows.Controls.Input"
Title
=
"Window1"
SizeToContent
=
"WidthAndHeight"
>
<
Grid
>
<
Grid.ColumnDefinitions
><
ColumnDefinition
Width
=
"Auto"
/><
ColumnDefinition
Width
=
"*"
/><
ColumnDefinition
Width
=
"Auto"
/></
Grid.ColumnDefinitions
>
<
Grid.RowDefinitions
><
RowDefinition
Height
=
"Auto"
/><
RowDefinition
Height
=
"Auto"
/></
Grid.RowDefinitions
>
<
Label
Grid.Column
=
"0"
Grid.Row
=
"0"
>ComboList</
Label
>
<
Controls:RadComboBox
x:Name
=
"comboEntries"
IsEditable
=
"True"
Margin
=
"5"
Grid.Column
=
"1"
Grid.Row
=
"0"
Width
=
"150"
ItemsSource
=
"{Binding Entries}"
SelectedItem
=
"{Binding CurrentEntry}"
></
Controls:RadComboBox
>
<
Button
Margin
=
"5"
Grid.Column
=
"2"
Grid.Row
=
"0"
Click
=
"Button_Click"
>Commit</
Button
>
<
Label
Grid.Column
=
"0"
Grid.Row
=
"1"
>ComboList2</
Label
>
<
Controls:RadComboBox
x:Name
=
"comboEntries2"
IsEditable
=
"True"
Margin
=
"5"
Grid.Column
=
"1"
Grid.Row
=
"1"
Width
=
"150"
ItemsSource
=
"{Binding Entries}"
SelectedItem
=
"{Binding CurrentEntry2}"
></
Controls:RadComboBox
>
<
Button
Margin
=
"5"
Grid.Column
=
"2"
Grid.Row
=
"1"
Click
=
"Button_Click2"
>Commit2</
Button
>
</
Grid
>
</
Window
>
code behind
public
partial
class
Window1 : Window, INotifyPropertyChanged
{
public
List<
string
> Entries {
get
;
set
; }
public
string
CurrentEntry {
get
;
set
; }
public
string
CurrentEntry2 {
get
;
set
; }
public
Window1()
{
Entries =
new
List<
string
> {
"entry1"
,
"entry2"
,
"entry3"
};
CurrentEntry =
"entry1"
;
CurrentEntry2 =
"entry2"
;
InitializeComponent();
DataContext =
this
;
}
private
void
Button_Click(
object
sender, RoutedEventArgs e)
{
if
(String.IsNullOrEmpty(comboEntries.Text) || Entries.Contains(comboEntries.Text))
return
;
Entries.Add(comboEntries.Text);
NotifyPropertyChanged(
"Entries"
);
}
private
void
Button_Click2(
object
sender, RoutedEventArgs e)
{
if
(String.IsNullOrEmpty(comboEntries2.Text) || Entries.Contains(comboEntries2.Text))
return
;
Entries.Add(comboEntries2.Text);
NotifyPropertyChanged(
"Entries"
);
}
public
event
PropertyChangedEventHandler PropertyChanged;
private
void
NotifyPropertyChanged(
string
propertyName)
{
if
(PropertyChanged !=
null
)
{
PropertyChanged(
this
,
new
PropertyChangedEventArgs(propertyName));
}
}
0
Accepted
Hi Trevor,
Since you are using List<T> as ItemsSource, RadComboBox does not receive notifications when you add or remove items from the list. The first time you open the dropdown the control creates RadComboBoxItem containers for each item in the items source and unless it receives a change notification it does not add/remove containers anymore. To resolve the problem you need to use ObservableCollection<T> as ItemsSource.
The notification for the Entries property does not work since you do not change the value of the Entries property (the collection itself hasn't changed, only its children).
Regards,
Valeri Hristov
the Telerik team
Since you are using List<T> as ItemsSource, RadComboBox does not receive notifications when you add or remove items from the list. The first time you open the dropdown the control creates RadComboBoxItem containers for each item in the items source and unless it receives a change notification it does not add/remove containers anymore. To resolve the problem you need to use ObservableCollection<T> as ItemsSource.
The notification for the Entries property does not work since you do not change the value of the Entries property (the collection itself hasn't changed, only its children).
Regards,
Valeri Hristov
the Telerik team
0
Trevor
Top achievements
Rank 1
answered on 25 Mar 2011, 06:16 PM
Many thanks for the swift response!
Now that you have pointed that out it makes sense and I should have thought of it. I think I had discounted updating of the binding as the autocomplete was finding the new entries.
Now that you have pointed that out it makes sense and I should have thought of it. I think I had discounted updating of the binding as the autocomplete was finding the new entries.