private void FilterItems()
        {
            IEnumerable source = ItemsSource;

            if (source == null)
            {
                FilteredItems.Clear();
                return;
            }

            IEnumerator enumerator = source.GetEnumerator();

            if (!enumerator.MoveNext())
            {
                FilteredItems.Clear();
                return;
            }

            FilterPredicate    predicate = Predicate;
            FilteredCollection filtered  = new FilteredCollection();

            do
            {
                object item = enumerator.Current;
                if (predicate == null || predicate.Matches(item))
                {
                    filtered.Add(item);
                }
            }while (enumerator.MoveNext());

            FilteredItems = filtered;
        }
 private void RegisterPredicate(FilterPredicate predicate)
 {
     if (predicate != null)
     {
         predicate.ItemsSource     = ItemsSource;
         predicate.FilterRequired += OnFilterRequired;
     }
 }
 private void UnregisterPredicate(FilterPredicate predicate)
 {
     if (predicate != null)
     {
         predicate.FilterRequired -= OnFilterRequired;
         predicate.ItemsSource     = null;
     }
 }
        private static void OnItemsSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            CollectionFilterBehavior behavior = (CollectionFilterBehavior)d;

            FilterPredicate predicate = behavior.Predicate;

            if (predicate != null)
            {
                predicate.ItemsSource = (IEnumerable)e.NewValue;
            }

            behavior.FilterItems();
        }
        private static void OnPredicateChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            CollectionFilterBehavior behavior = (CollectionFilterBehavior)d;

            FilterPredicate oldPredicate = (FilterPredicate)e.OldValue;

            behavior.UnregisterPredicate(oldPredicate);

            FilterPredicate newPredicate = (FilterPredicate)e.NewValue;

            behavior.RegisterPredicate(newPredicate);

            behavior.FilterItems();
        }