ICollectionView上的多个过滤器,带有多个条件检查WPF

时间:2018-04-22 12:53:19

标签: c# wpf icollectionview

以前曾以不同的形式提出这个问题,但没有人回答我的问题。在发布此消息之前,我已经抓住了这个论坛和Windows开发论坛的信息。我无法理解如何完成这项任务。

我在我的智慧结束。

我有一个绑定到ICollectionView的DataGrid。此数据是通过存储过程提取的,DataGrid是根据每个表中的列自动生成的。作为参考,SP返回一个对象列表,每个对象都有一系列成员,如stock_symbol,stock_price,Date等。

我想将一系列过滤器应用于此集合视图。两个组合框和两个日期选择器,更具体。每个都有一个复选框,表示他们是活跃的。

每个复选框事件处理程序都存储从组合框或日期选择器中选择的数据。我试图将这些变量中的内容与对象列表的每个相关成员进行比较,并将过滤后的对象列表发送回DataGrid。

这是我的代码:

private void FillDataGrid()
    {
        //Connect contains a simple stored procedure connection to SQL server
        var Client = Connect();
        DTOClass[] dTOs = Client.GetData();
        SetDTOClass(dTOs);

        MainGrid.ItemsSource = FilterView(dTOs);
    }

这是FilterView()(对于长篇评论部分道歉,我试图将我的尝试包含在一次犯规中):

 public ICollectionView /*List<DTOClass>*/ FilterView(DTOClass[] DTO)
    {
        if (_CollectionViewInternal == null)
        {
            //Assign collected DTO object to an ICollectionView
            _CollectionViewInternal = 
       CollectionViewSource.GetDefaultView(DTO);
        }

        /*
        ObservableCollection<DTOClass> DTOview = null;

        if (DTOViewInternal == null)
        {
            int j = DTO.Length;
            DTOview = new ObservableCollection<DTOClass>();
            for(int i = 0; i < j; i++)
            {
                DTOview.Add(DTO[i]);
            }
            DTOViewInternal = DTOview;
        }
        */

        //Add a default sort description to the Date column
        _CollectionViewInternal.SortDescriptions.Add(new SortDescription("Date", ListSortDirection.Ascending));

        //assign our view to the maingrid (move this to later in the 
        //MainGrid.ItemsSource = _CollectionViewInternal;

        if (MainGrid.ItemsSource != null)
        {

            /*List<Predicate<IEnumerable<DTOClass[]>>>*/ FilteredView = new List<Predicate<IEnumerable<DTOClass[]>>>();

            //DateTime _zeroDay = new DateTime(1, 1, 1);
            //DateTime _now = DateTime.Now;

            FilteredView.Clear();


            return FilteredView = _CollectionViewInternal.Where(Function(w) w.accountname.Contains(txtFilter.Text) _
                            Or w.firstname.Contains(txtFilter.Text) _
                            Or w.lastname.Contains(txtFilter.Text) _
                            Or w.isenabled.Contains(txtFilter.Text) _
                            Or w.description.Contains(txtFilter.Text) _
                            Or w.lastlogontimestamp.Contains(txtFilter.Text) _
                            Or w.whencreated.Contains(txtFilter.Text) _
                            Or w.whenchanged.Contains(txtFilter.Text) _
                            Or w.oulocation.Contains(txtFilter.Text) _
                            Or w.co.Contains(txtFilter.Text) _
                            Or w.l.Contains(txtFilter.Text) _
                            Or w.state.Contains(txtFilter.Text))


            //if (yearsChosen > 0)
            /* Stock, Maxadj, FromDate, ToDate */
            /*
            if (Stock_CheckBox.IsChecked != null)
            {

                FilteredView.Add(new Predicate<IEnumerable<DTOClass[]>>(x => x.Where(item => item. == Stock_ComboBoxText)));
            }

            if (letterChosen != "Any")
            {
                FilteredView.Add(new Predicate<IEnumerable<DTOClass[]>>(x => x.LastName.StartsWith(letterChosen)));
            }
            if (genderChosen != "Any")
            {
                FilteredView.Add(new Predicate<IEnumerable<DTOClass[]>>(x => x.Gender.Equals(genderChosen.Substring(0, 1))));
            }

            _CollectionViewInternal.Filter = dynamic_Filter;
            RaisePropertyChanged("PeopleView");
            // Bring the current person back into view in case it moved
            if (CurrentPerson != null)
            {
                IEnumerable<DTOClass[]> current = CurrentPerson;
                _CollectionViewInternal.MoveCurrentToFirst();
                _CollectionViewInternal.MoveCurrentTo(current);
            }
            */


            /*
            if (DTOview == null)
            {
                DTOview = DTOViewInternal;
            } else
            {
                DTOViewInternal.
            }
            */


            //var collection = DTO;
            //var symbol = collection.Where(item => item.Date == ).ToList();

            //DTOview = new ObservableCollection<DTOClass>();
            //IEnumerable<DTOClass> DTOview2;
            //List<IEnumerable<DTOClass>> FilteredView = new List<IEnumerable<DTOClass>>();

            /*
            if (Stock_ComboBoxText != null)
            {
                //var collection = DTO;
                var collection = DTO.Where(item => item.stock_symbol == Stock_ComboBoxText).Cast<DTOClass>().ToList();
                //DTOview.Add(filtered.Cast<DTOClass>());
                //FilteredView.Add(collection.Cast<DTOClass>());
                FilteredView.Add(collection);
                MainGrid.ItemsSource = FilteredView[0];
                //FilteredView = filtered.Cast<DTOClass>();

            }
            if (Maxadj_ComboBoxText != 0)
            {
                var collection = DTO.Where(item => item.stock_price_adj_close == Maxadj_ComboBoxText).Cast<DTOClass>().ToList();
                FilteredView.Add(collection);
                MainGrid.ItemsSource = FilteredView[0];

                //DTOview.Add(DTO.Where(item => item.stock_price_adj_close == ).ToList());
            }
            if (From_DatePickValue != null)
            {
                var collection = DTO.Where(item => item.Date >= From_DatePickValue).Cast<DTOClass>().ToList();
                FilteredView.Add(collection);
                MainGrid.ItemsSource = FilteredView[0];

            }
            if (To_DatePickValue != null)
            {
                var collection = DTO.Where(item => item.Date <= To_DatePickValue).Cast<DTOClass>().ToList();
                FilteredView.Add(collection);
                MainGrid.ItemsSource = FilteredView[0];

            }
            */





            //DTOview = DTOViewInternal;
            //DTOview = null;
            //DTOClass[] dto = GetDTOClass();

            //ListCollectionView collectionView = new ListCollectionView(DTOViewInternal);


            /*
            collectionView.Filter = (e) =>
            {
            //int j = DTO.Length;
            DTOClass[] dtofiltered = e as DTOClass[];


            //for (int i = 0; i < j; i++)
            //{

                if ((Stock_ComboBoxText != null) && (DTOview[0][i].stock_symbol == Stock_ComboBoxText))
                {
                    return true;
                }
                if ((Maxadj_ComboBoxText != 0) && (DTOview[0][i].stock_price_adj_close == Maxadj_ComboBoxText))
                {
                    return true;
                }
                if ((From_DatePickValue != null) && (DTOview[0][i].Date >= From_DatePickValue))
                {
                    return true;
                }
                if ((To_DatePickValue != null) && (DTOview[0][i].Date <= To_DatePickValue))
                {
                    return true;
                }
            }

            return true;
        };
        */

            //return collectionView.Cast<DTOClass>().ToList();
            //return collectionView.Filter;
            //return null;
            //MainGrid.ItemsSource = null;
            //MainGrid.ItemsSource = (CollectionView)CollectionViewSource.GetDefaultView(collectionView.ToString());

        }
        else
        {
            //MainGrid.ItemsSource = DTOview[0].ToList();
            //MainGrid.ItemsSource = DTOview;
            //return DTOview[0].ToList();

            return _CollectionViewInternal;
        }
        return _CollectionViewInternal;
    }

如果选中了相关的复选框,我只想过滤列。这是一个简单的选择与一个过滤器,但不止一个被证明是超越挑战。

如您所见,我尝试过多种解决方案。我尝试过使用ObservableCollection,我尝试直接过滤对象列表,然后将其添加到ICollectionView。什么都行不通。

我一直试图嫁接这个例子:Complicated Filtering ICollectionView。但我无法做出正面或反面。我仍然不理解谓词,而且我真的无法理解它的工作原理。

我知道它不好意思要求提供代码&#39;的问题。但是,如果有人能够看到过去,并指出我在这里做错了什么,甚至可能给我代码,我将非常感激。我花了几周时间试图理解这一点,而且我已经没时间完成这项任务了。

如果没有,那很酷但请不要评论这个帖子。不要因为扣留答案而感到自豪,我通常是一名嵌入式C程序员,我刚刚完成了一个大型的OSX-Windows端口,用于大量的Adobe AfterFX插件。所以我不需要讽刺言论或任何关于更多努力学习的废话,我只想完成这项任务并完成它。

提前谢谢大家。

1 个答案:

答案 0 :(得分:0)

补充上述评论的代码:

List<Predicate<IEnumerable<DTOClass[]>>> FilteredView = null;

 public ICollectionView FilterView(DTOClass[] DTO)
 {
    List<Predicate<IEnumerable<DTOClass[]>>>FilteredView = new 
    List<Predicate<IEnumerable<DTOClass[]>>>();

    FilteredView.Clear();

    if (Stock_CheckBox.IsChecked != null)
    {

    FilteredView.Add(new Predicate<IEnumerable<DTOClass[]>>(x => x.Where(item => item.stock_symbol == Stock_ComboBoxText)));
    }
}

我甚至无法让第一个谓词起作用。显然.stock_symbol不存在,我无法索引项目。我想我的真正问题是如何访问stock_symbol成员?

抱怨这么长时间到达那里,我极度睡眠不足。

修改

在没有睡觉的情况下犯下愚蠢的错误。

 List<Predicate<DTOClass>> FilteredView = new List<Predicate<DTOClass>>();

            if (Stock_CheckBox.IsChecked != null)
            {
                for (int i = 0; i < DTO.Length; i++)
                {
                    FilteredView.Add(new Predicate<DTOClass>(x => x.stock_symbol == _Stock_ComboBoxText));
                    //FilteredView.Add(new Predicate<DTOClass[]>>(x => x.stock_symbol == _Stock_ComboBoxText));
                }
            }