我正在尝试对ObservableCollection<>
实施过滤。我当前ObservableCollection<Payee>
在ItemsSource
上的GridView
工作正常。我添加了一个名为ObservableCollection<Payee>
的{{1}}作为FilteredPayees
。出于某种原因,当我尝试过滤项目时,ItemsSource
显示为空白。
以下是我正在使用的代码:
GridView
基本上,如果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
集合中有35个项目(未过滤时为65个)。它似乎不是任何类型的“未设置为对象实例的对象”或类似的东西。有什么理由
_filteredPayees
可行,但
this.FilteredPayees = _payees;
会不会?
修改
我现在可以通过删除_filteredPayees = _payees;
this.FilteredPayees = _filteredPayees;
属性来让它工作。我只是过滤了FilteredPayees
事件处理程序中的原始Payees
集合,这与我调用OnNavigatedTo()
的地方完全相同。
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
设置已更改则无需重新加载 - 只需更改过滤器即可集合。
答案 0 :(得分:2)
您正在为FilteredPayees
属性分配新对象,因此必须通知GridView
已更改属性FilteredPayees
。 RaisePropertyChanged("FilteredPayees")
。
FilteredPayees
或您的通知代码
此外,GridView.ItemsSource
的绑定模式不应为BindingMode.OneTime
。
答案 1 :(得分:0)
要在WPF中过滤集合,可能更容易使用ICollectionView
。例如:
public class Foo
{
private List<Payee> _payees;
private ICollectionView _filteredPayees;
public ICollectionView FilteredPayees
{
get { return _filteredPayees; }
}
public Foo()
{
_payees = GetPayees();
_filteredPayees = CollectionViewSource.GetDefaultView(_payees);
_filteredPayees.Filter = FilterPayees;
}
private bool FilterPayees(object item)
{
var payee = item as Payee;
if (payee == null)
{
return false;
}
if (_settings.ShowInactivePayees)
{
return true;
}
return payee.IsOpen;
}
}
您可以像任何其他属性一样绑定属性FilteredPayees
。优点是,您不需要两个属性,并且可以避免要绑定哪个集合的逻辑。
答案 2 :(得分:0)
_filteredPayees = new ObservableCollection<Payee>(filtered);
在这里,您创建了一个全新的对象,并且ObservableCollection不能自动观察。可能的解决方案是在此行之后再次在GridView上设置ItemsSource。