// bind the DisplayMemberPath to DisplayMemberPath of the two list boxes
        private static void DisplayMemberPathPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
        {
            MultiSelectControl control = sender as MultiSelectControl;

            if (control == null)
            {
                return;
            }
            control.AvailableListBox.DisplayMemberPath = control.DisplayMemberPath;
            control.SelectedListBox.DisplayMemberPath  = control.DisplayMemberPath;
        }
        // get a handle on the default view for Available list box and set filter
        private static void ItemsSourcePropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
        {
            IEnumerable        source  = e.NewValue as IEnumerable;
            MultiSelectControl control = sender as MultiSelectControl;

            if (source == null || control == null)
            {
                return;
            }

            control.availableItemsCollectionView        = CollectionViewSource.GetDefaultView(source);
            control.availableItemsCollectionView.Filter = new Predicate <object>(control.FilterOutItems);
        }
        // get a handle on the default view for Selected list box and set filter
        private static void SelectedItemsPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
        {
            IList source = e.NewValue as IList;
            MultiSelectControl control = sender as MultiSelectControl;

            if (source == null || control == null)
            {
                return;
            }
            control.selectedItemsCollectionView        = CollectionViewSource.GetDefaultView(source);
            control.selectedItemsCollectionView.Filter = new Predicate <object>(control.FilterOutSelectedItems);
            // refresh the available items list to ensure that it shows correct data
            control.availableItemsCollectionView.Refresh();
        }