public void TestFilterIsMatch()
        {
            ObjectEqualFilter    filter = GetEqualFilter();
            CollectionViewSource cvs    = new();
            var source = enumSource.ToList();

            cvs.Source = source;
            ICollectionView view = cvs.View;

            Assert.IsTrue(view.CanFilter);
            using (IDisposable defer = view.DeferRefresh()) {
                view.Filter = el => {
                    BolapanControl.ItemsFilter.FilterEventArgs e = new(el);
                    filter.IsMatch(null, e);
                    return(e.Accepted);
                };
            }
            var filtered = GetCollection(view);

            Assert.AreEqual(source.Count, filtered.Count);
            List <int?> selected   = new(new int?[] { source[0], source[1] });
            List <int?> unselected = new();

            filter.SelectedValuesChanged(addedItems: selected, removedItems: unselected);
            view.Refresh();
            filtered = GetCollection(view);
            Assert.AreEqual(selected.Count, filtered.Count);
            Assert.AreEqual(selected[0], filtered[0]);
            Assert.AreEqual(selected[1], filtered[1]);
            selected = new(new int?[] { source[^ 1] });
        public void CTOR()
        {
            ObjectEqualFilter filter = GetEqualFilter();

            Assert.IsNotNull(filter);

            Assert.AreEqual(0, filter.SelectedValues.Count);
            Assert.IsFalse(filter.IsActive);
        }
        public void TestAvailableValues()
        {
            ObjectEqualFilter filter = GetEqualFilter();
            var source = enumSource.ToList();

            filter.AvailableValues = source;
            CollectionViewSource cvs = new();

            cvs.Source = filter.AvailableValues;
            ICollectionView view        = cvs.View;
            var             currentView = GetCollection(view);

            Assert.AreEqual(source.Count, currentView.Count);
        }
        protected static Filter?NewFilter(FilterPresenter filterPresenter, ItemPropertyInfo propertyInfo)
        {
#if DEBUG
            Microsoft.VisualStudio.TestTools.UnitTesting.Assert.IsNotNull(filterPresenter);
            Microsoft.VisualStudio.TestTools.UnitTesting.Assert.IsNotNull(propertyInfo);
#endif

            Type propertyType = propertyInfo.PropertyType;
            if (filterPresenter.ItemProperties.Contains(propertyInfo) &&
                !propertyType.IsEnum
                )
            {
                Type   generic       = typeof(IEquatable <>);
                Type[] tArgs         = new Type[] { propertyType };
                Type   iquatableType = generic.MakeGenericType(tArgs);
                Filter?filter        = null;
                if (iquatableType.IsAssignableFrom(propertyType))
                {
                    filter = Activator.CreateInstance(
                        typeof(EqualFilter <>).MakeGenericType(propertyType),
                        propertyInfo,
                        GetAvailableValuesQuery(filterPresenter, propertyInfo)
                        ) as Filter;
                }
                else
                {
                    filter = new ObjectEqualFilter(propertyInfo, GetAvailableValuesQuery(filterPresenter, propertyInfo));
                }
                if (filter != null)
                {
                    filter.Attach(filterPresenter);
                }
                return(filter);
            }
            return(null);
        }