的ObservableCollection<>未正确加载

时间:2015-07-20 05:26:01

标签: c# gridview windows-runtime

我正在尝试对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设置已更改则无需重新加载 - 只需更改过滤器即可集合。

3 个答案:

答案 0 :(得分:2)

您正在为FilteredPayees属性分配新对象,因此必须通知GridView已更改属性FilteredPayeesRaisePropertyChanged("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。