我试图在ObservableCollection<>
上实现过滤。我目前的ObservableCollection<Payee>
在GridView
上正常工作为ItemsSource
。我添加了第二个ObservableCollection<Payee>
,名为FilteredPayees
,用作ItemsSource
。出于某种原因,当我尝试过滤这些项目时,GridView
显示为空白。ObservableCollection <>不能正确加载
这里是我使用的代码:
private void FilterPayees()
{
if (!_settings.ShowInactivePayees)
{
var filtered = _payees.Where(p => p.IsOpen == true);
_filteredPayees = new ObservableCollection<Payee>(filtered);
}
else
{
_filteredPayees = _payees;
}
this.FilteredPayees = _filteredPayees;
}
基本上,如果ShowInactivePayees
设置是关闭的,它应该过滤掉无效收款人。如果它打开,那么只需使用完整的_payees
集合。但奇怪的事情,如果我最后一行改为:
this.FilteredPayees = _payees;
那么GridView
将显示所有收款人的,只是因为它应该,如果“显示不活动收款人”设置中开启。我设置了断点,_filteredPayees
集合中有35个项目(或65个不过滤时)。它似乎不是任何类型的“未设置为对象实例的对象”或类似的东西。有一些原因,
this.FilteredPayees = _payees;
会的工作,但
_filteredPayees = _payees;
this.FilteredPayees = _filteredPayees;
不会?
编辑
我能够得到它通过摆脱FilteredPayees
属性为现在的工作。我只在OnNavigatedTo()
事件处理程序中过滤原始Payees
集合,这与我拨打FilteredPayees()
的地方完全相同。
// load payees
var payees = await _payeesRepository.LoadAllAsync();
if (!_settings.ShowInactivePayees)
{
payees = payees.Where(p => p.IsOpen);
}
payees = payees.OrderBy(p => p.CompanyName);
this.Payees = new ObservableCollection<Payee>(payees);
我添加的唯一部分是if (!_settings.ShowInactivePayees) ...
块。我使用FilteredPayees
属性的理由是,我可以在Payees
属性中加载完整集合,如果ShowInactivePayees
设置发生更改,则无需重新加载 - 只需更改集合的过滤器即可。
简短的回答:不长 - 答案:它取决于...是否有任何其他代码更改'_filteredPayees'? – derape