Exemple #1
0
        protected virtual void Filter(FilterDescriptorCollection descriptors)
        {
            FilterDescriptor[] currentDescriptors = descriptors.ToArray();
            ExpressionNode     node = ExpressionParser.Parse(descriptors.Expression, this.masterTemplate.CaseSensitive);

            if (this.CurrentOperation != ItemSourceOperation.None || node == null || currentDescriptors.Length == 0)
            {
                this.view             = this.dataSource;
                this.CurrentOperation = ItemSourceOperation.None;
                return;
            }

            this.CurrentOperation = ItemSourceOperation.Filtering;
            List <object> newView      = new List <object>();
            IList         filteredView = this.dataSource;

            for (int i = 0; i < filteredView.Count; i++)
            {
                if (!this.perform)
                {
                    this.CurrentOperation = ItemSourceOperation.None;
                    return;
                }

                object            entry   = filteredView[i];
                ExpressionContext context = new ExpressionContext();

                for (int j = 0; j < currentDescriptors.Length; j++)
                {
                    string member = currentDescriptors[j].PropertyName;
                    if (!context.ContainsKey(member))
                    {
                        context.Add(member, this.GetValue(entry, member));
                    }
                    else
                    {
                        context[member] = this.GetValue(entry, member);
                    }
                }

                object evalResult = node.Eval(null, context);

                if (evalResult is bool && (bool)evalResult)
                {
                    newView.Add(entry);
                }
            }

            this.view             = newView;
            this.CurrentOperation = ItemSourceOperation.None;
        }