Hi, I am having an issue with a standalone RadMultiColumnComboBox. It needs to be populated differently each time I select a different entity (User) from a RadGridView. As I understand it the only way to do this is with events.
The problem is that I run into an exception when I try to clear the selected items from the MCCB (basically, I need to reset it), and add the new selections. I get various ObservableCollection changed event exceptions.
What is the correct way to do this to avoid these type of exceptions?
Thanks,
Ian
Here is the code I use so far:
Private
changingUser
As
Boolean
=
False
Private
Sub
RadMultiColumnComboBox_SelectionChanged(sender
As
Object
, e
As
SelectionChangeEventArgs)
Try
SyncLock
lockObject
If
changingUser
Then
e.Handled =
True
changingUser =
False
Exit
Sub
End
If
End
SyncLock
If
e.AddedItems.Count = 0
AndAlso
e.RemovedItems.Count = 0
Then
Exit
Sub
vm.AddRemoveRoles(e.AddedItems, e.RemovedItems)
Catch
ex
As
Exception
Finally
e.Handled =
True
End
Try
End
Sub
Private
Sub
Grid_SelectionChanged(sender
As
Object
, e
As
SelectionChangeEventArgs)
Try
SyncLock
lockObject
changingUser =
True
End
SyncLock
RolesBox.SelectedItems.SuspendNotifications()
'RolesBox is the RadMultiColumnComboBox
RolesBox.SelectedItems.Clear()
Dim
roles = vm.GetSelectedUserRoles
For
Each
r
In
roles
RolesBox.SelectedItems.Add(r)
Next
Catch
ex
As
Exception
Finally
RolesBox.SelectedItems.ResumeNotifications()
SyncLock
lockObject
changingUser =
False
End
SyncLock
End
Try
End
Sub
Here is an example of the exceptions I am getting:
System.InvalidOperationException:
'Cannot change ObservableCollection during a CollectionChanged event.'
at
System.Collections.ObjectModel.ObservableCollection`1.CheckReentrancy()
at
System.Collections.ObjectModel.ObservableCollection`1.RemoveItem(Int32 index)
at
System.Collections.ObjectModel.Collection`1.Remove(T item)
at
Telerik.Windows.Controls.RadMultiColumnComboBox.OnSelectedItemPropertyChanged(DependencyObject
d, DependencyPropertyChangedEventArgs args)
at
System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs
e)
at
System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs
e)
at
System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs
args)
at
System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex,
DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry,
EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, Boolean
coerceWithCurrentValue, OperationType operationType)
at
System.Windows.DependencyObject.SetValueCommon(DependencyProperty dp, Object
value, PropertyMetadata metadata, Boolean coerceWithDeferredReference, Boolean
coerceWithCurrentValue, OperationType operationType, Boolean isInternal)
at
System.Windows.DependencyObject.SetValue(DependencyProperty dp, Object value)
at
Telerik.Windows.Controls.MultiColumnComboBox.SelectionBridge.ItemsSelectedInOwner(IEnumerable`1
addedItems)
at
Telerik.Windows.Controls.MultiColumnComboBox.SelectionBridge.OwnerSelectedItemsCollectionChanged(Object
sender, NotifyCollectionChangedEventArgs e)
at
System.Collections.Specialized.NotifyCollectionChangedEventHandler.Invoke(Object
sender, NotifyCollectionChangedEventArgs e)
at
System.Collections.ObjectModel.ObservableCollection`1.OnCollectionChanged(NotifyCollectionChangedEventArgs
e)
at
System.Collections.ObjectModel.ObservableCollection`1.InsertItem(Int32 index, T
item)