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