Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按数据网格筛选分组_C#_Wpf_Linq_Mvvm_Datagrid - Fatal编程技术网

C# 按数据网格筛选分组

C# 按数据网格筛选分组,c#,wpf,linq,mvvm,datagrid,C#,Wpf,Linq,Mvvm,Datagrid,我正在开发WPF-MVVM应用程序 我有一个数据网格,由一个文本框过滤的发票填充,运行良好 现在,我按发票编号suppInvNumber对发票进行了分组,过滤器不再工作 我怎样才能让它工作 视图模型 我怀疑上述逻辑是否有效!!我看不到FilterString Changed和Filter之间的链接。@Nikita他在FilterString的setter中调用_dataGridCollection.Refresh。这将在当前过滤器的影响下重新创建视图。您看到显示的数据了吗?它是分组的,但没有排序

我正在开发WPF-MVVM应用程序

我有一个数据网格,由一个文本框过滤的发票填充,运行良好

现在,我按发票编号suppInvNumber对发票进行了分组,过滤器不再工作

我怎样才能让它工作

视图模型
我怀疑上述逻辑是否有效!!我看不到FilterString Changed和Filter之间的链接。@Nikita他在FilterString的setter中调用_dataGridCollection.Refresh。这将在当前过滤器的影响下重新创建视图。您看到显示的数据了吗?它是分组的,但没有排序?@Nikita DataGridCollection是一个属性,它只是后台字段的包装器,您称之为私有变量。因此_datagridColl.Refresh与DataGridCollection.Refresh相同-筛选器由该引用持有,并且它知道该筛选器,因此它可以在内部循环中调用该回调以确定哪些项添加到视图中,如果传入的项的回调返回true,则该项将添加到视图中,否则,该项目将被排除在外。过滤就是这样工作的。@KingKing谢谢你的解释!!真的很有帮助。
public class ConsultInvoiceViewModel:ViewModelBase
    {
        public Context ctx = new Context();

        private ICollectionView _dataGridCollection;
        private string _filterString;
        private ObservableCollection<Invoice> invoiceCollection; 

        public ConsultInvoiceViewModel()
        {
            DataGridCollection = CollectionViewSource.GetDefaultView(Get());
            DataGridCollection.Filter = new Predicate<object>(Filter);
        }

        public ICollectionView DataGridCollection
        {
            get
            { 
                return _dataGridCollection; 
            }
            set 
            { 
                _dataGridCollection = value; 
                OnPropertyChanged("DataGridCollection"); }
        }

        public string FilterString
        {
            get 
            { 
                return _filterString; 
            }
            set 
            {
                _filterString = value;
                OnPropertyChanged("FilterString");
                FilterCollection();
            }
        }

        private void FilterCollection()
        {
            if (_dataGridCollection != null)
            {
                _dataGridCollection.Refresh();
            }
        }

        public bool Filter(object obj)
        {
            var data = obj as Invoice;
            if (data != null)
            {
                if (!string.IsNullOrEmpty(_filterString))
                {
                    return data.suppInvNumber.Contains(_filterString)

                }
                return true;
            }
            return false;
        }


        private ObservableCollection<Invoice> Get()
        {
            var query = ctx.Invoices
                        .GroupBy(x => new { x.suppInvNumber, x.shop1, x.date, x.foodSupplier })
                        .ToList()
                        .Select(i => new Invoice
                        {
                            suppInvNumber = i.Key.suppInvNumber,
                            shop1 = i.Key.shop1,
                            date = i.Key.date,
                            foodSupplier = i.Key.foodSupplier,
                            totalPrice = i.Sum(t => t.totalPrice),
                        })
                        .AsQueryable();

            invoiceCollection = new ObservableCollection<Invoice>(query);
            return invoiceCollection;
        }
}