@@ -215,18 +215,19 @@ protected override void PrepareContainerForItemOverride(DependencyObject element
215215 protected override void OnSelectionChanged ( SelectionChangedEventArgs e )
216216 {
217217 base . OnSelectionChanged ( e ) ;
218+ if ( ! IsLoaded ) return ;
218219 if ( SelectedItems != null )
219220 {
220221 foreach ( var item in e . AddedItems )
221222 {
222223 if ( ! SelectedItems . Contains ( item ) )
223224 {
224- SelectedItems . Add ( item ) ;
225+ TrySelectItem ( item ) ;
225226 }
226227 }
227228 foreach ( var item in e . RemovedItems )
228229 {
229- SelectedItems . Remove ( item ) ;
230+ TryUnselectItem ( item ) ;
230231 }
231232 if ( ! _isUpdating && SelectedItemsExt != null )
232233 {
@@ -317,7 +318,14 @@ public override void OnApplyTemplate()
317318 AddHandler ( Controls . Tag . CloseEvent , new RoutedEventHandler ( Tags_Close ) ) ;
318319 _panel = GetTemplateChild ( PART_SimpleWrapPanel ) as Panel ;
319320 }
321+ UpdateText ( ) ;
320322 SyncListViewViews ( ) ;
323+ Loaded += OnMultiSelectComboBox_Loaded ;
324+ }
325+
326+ private void OnMultiSelectComboBox_Loaded ( object sender , RoutedEventArgs e )
327+ {
328+ UpdateText ( ) ;
321329 }
322330
323331 public MultiSelectComboBox ( )
@@ -448,7 +456,7 @@ private void OnDataGridSearch_SelectionChanged(object sender, SelectionChangedEv
448456 if ( _listViewSearch . Items . Contains ( item ) )
449457 {
450458 if ( SelectedItems . Contains ( item ) )
451- SelectedItems . Remove ( item ) ;
459+ TryUnselectItem ( item ) ;
452460 }
453461
454462 if ( selectedList . Contains ( item ) )
@@ -464,7 +472,7 @@ private void OnDataGridSearch_SelectionChanged(object sender, SelectionChangedEv
464472 foreach ( var item in e . AddedItems )
465473 {
466474 if ( ! SelectedItems . Contains ( item ) )
467- SelectedItems . Add ( item ) ;
475+ TrySelectItem ( item ) ;
468476 }
469477
470478 UpdateText ( ) ;
@@ -569,9 +577,24 @@ private void SearchText(string text)
569577 selectedItems . Clear ( ) ;
570578 foreach ( var item in _listViewSearch . Items )
571579 {
580+ //if (SelectedItems.Contains(item))
581+ // if (!_listViewSearch.SelectedItems.Contains(item))
582+ // _listViewSearch.SelectedItems.Add(item);
572583 if ( SelectedItems . Contains ( item ) )
584+ {
573585 if ( ! _listViewSearch . SelectedItems . Contains ( item ) )
574- _listViewSearch . SelectedItems . Add ( item ) ;
586+ {
587+ if ( SelectionMode == SelectionMode . Single )
588+ {
589+ _listViewSearch . SelectedItem = item ;
590+ }
591+ else
592+ {
593+ if ( ! _listViewSearch . SelectedItems . Contains ( item ) )
594+ _listViewSearch . SelectedItems . Add ( item ) ;
595+ }
596+ }
597+ }
575598 }
576599 }
577600 }
@@ -721,13 +744,21 @@ void CreateTag(object item, MultiSelectComboBoxItem multiSelectComboBoxItem = nu
721744 if ( ItemsSource != null && ( ! string . IsNullOrEmpty ( SelectedValuePath ) || ! string . IsNullOrEmpty ( DisplayMemberPath ) ) )
722745 {
723746 var bindingPath = ! string . IsNullOrEmpty ( SelectedValuePath ) ? SelectedValuePath : DisplayMemberPath ;
724- var binding = new Binding ( bindingPath ) { Source = item } ;
725- tag . SetBinding ( ContentControl . ContentProperty , binding ) ;
747+ var property = item . GetType ( ) . GetProperty ( bindingPath ) ;
748+ if ( property != null && property . GetValue ( item , null ) != null )
749+ {
750+ var binding = new Binding ( bindingPath ) { Source = item } ;
751+ tag . SetBinding ( ContentControl . ContentProperty , binding ) ;
752+ }
753+ else
754+ tag . Content = item ;
755+ //var binding = new Binding(bindingPath) { Source = item };
756+ //tag.SetBinding(ContentControl.ContentProperty, binding);
726757 }
727758 else
728759 {
729- if ( multiSelectComboBoxItem != null )
730- tag . Content = multiSelectComboBoxItem . Content ;
760+ if ( item != null )
761+ tag . Content = item ;
731762 }
732763 }
733764
@@ -753,13 +784,13 @@ private void Tags_Close(object sender, RoutedEventArgs e)
753784 {
754785 if ( SelectedItems . Contains ( item ) )
755786 {
756- SelectedItems . Remove ( item ) ;
787+ TryUnselectItem ( item ) ;
757788 }
758789 else
759790 {
760791 var match = Items . Cast < object > ( ) . FirstOrDefault ( h => this . GetDisplayAndSelectedValue ( h ) . ToString ( ) == this . GetDisplayAndSelectedValue ( item ) . ToString ( ) ) ;
761792 if ( match != null && SelectedItems . Contains ( match ) )
762- SelectedItems . Remove ( match ) ;
793+ TryUnselectItem ( match ) ;
763794 }
764795 }
765796 }
@@ -793,7 +824,7 @@ private static void OnSelectedItemsExtChanged(DependencyObject d, DependencyProp
793824 model = ctrl . ItemsSource . OfType < object > ( )
794825 . FirstOrDefault ( h => h == item ) ;
795826 if ( model != null && ! ctrl . SelectedItems . Contains ( item ) )
796- ctrl . SelectedItems . Add ( model ) ;
827+ ctrl . TrySelectItem ( model ) ;
797828
798829 }
799830 ctrl . _isUpdating = false ;
@@ -812,7 +843,7 @@ private void OnSelectedItemsExtCollectionChanged(object sender, NotifyCollection
812843 foreach ( var item in e . OldItems )
813844 {
814845 if ( SelectedItems . Contains ( item ) )
815- SelectedItems . Remove ( item ) ;
846+ TryUnselectItem ( item ) ;
816847 }
817848 }
818849
@@ -821,11 +852,39 @@ private void OnSelectedItemsExtCollectionChanged(object sender, NotifyCollection
821852 foreach ( var item in e . NewItems )
822853 {
823854 if ( ! SelectedItems . Contains ( item ) )
824- SelectedItems . Add ( item ) ;
855+ TrySelectItem ( item ) ;
825856 }
826857 }
827858 _isUpdating = false ;
828859 }
860+
861+ private void TrySelectItem ( object item )
862+ {
863+ if ( SelectionMode == SelectionMode . Single )
864+ {
865+ SelectedItem = item ;
866+ }
867+ else
868+ {
869+ if ( ! SelectedItems . Contains ( item ) )
870+ SelectedItems . Add ( item ) ;
871+ }
872+ }
873+
874+ private void TryUnselectItem ( object item )
875+ {
876+ if ( SelectionMode == SelectionMode . Single )
877+ {
878+ if ( Equals ( SelectedItem , item ) )
879+ SelectedItem = null ;
880+ }
881+ else
882+ {
883+ if ( SelectedItems . Contains ( item ) )
884+ SelectedItems . Remove ( item ) ;
885+ }
886+ }
887+
829888 }
830889 public enum ShowType
831890 {
0 commit comments