C# 可观察收集<&燃气轮机;未正确加载

C# 可观察收集<&燃气轮机;未正确加载,c#,gridview,windows-runtime,C#,Gridview,Windows Runtime,我正在尝试对可观测集合实施过滤。我当前的ObservableCollection作为ItemsSource在GridView上运行良好。我添加了第二个名为FilteredPayes的ObservableCollection以用作项目资源。出于某种原因,当我尝试筛选项目时,GridView显示为空白 以下是我正在使用的代码: private void FilterPayees() { if (!_settings.ShowInactivePayees) { var

我正在尝试对
可观测集合实施过滤。我当前的
ObservableCollection
作为
ItemsSource
GridView
上运行良好。我添加了第二个名为
FilteredPayes
ObservableCollection
以用作
项目资源。出于某种原因,当我尝试筛选项目时,
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;
}
然后,
GridView
将显示所有收款人,就像打开“显示非活动收款人”设置一样。我设置了断点,
\u filteredpayes
集合中有35个项目(不过滤时有65个)。它似乎不是任何类型的“未设置为对象实例的对象”或类似的内容。有什么原因吗

this.FilteredPayees = _payees;
会有用的,但是

_filteredPayees = _payees;
this.FilteredPayees = _filteredPayees;
不会吗

编辑

我现在可以通过去掉
filteredpayes
属性使它工作。我只是在
OnNavigatedTo()
事件处理程序中过滤原始
收款人
集合,它与我调用
filteredpayes()
的位置完全相同

//加载收款人
var payees=Wait_PayesRepository.LoadAllAsync();
如果(!\u设置。显示不活动收款人)
{
收款人=收款人。其中(p=>p.IsOpen);
}
收款人=收款人.OrderBy(p=>p.CompanyName);
此.收款人=新的可观察收款人(收款人);

我添加的唯一部分是
if(!\u settings.ShowInactivePayees).
块。我使用
FilteredPayes
属性的理由是,我可以在
Payes
属性中加载完整的集合,并且如果
ShowInactivePayes
设置发生更改,则无需重新加载-只需更改集合的筛选器。

对于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;
    }
}
公共类Foo
{
私人名单收款人;
私有ICollectionView_FilteredPayes;
公共ICollectionView筛选器页面
{
获取{return\u filteredpayes;}
}
公共食物(
{
_收款人=GetPayes();
_FilteredPayes=CollectionViewSource.GetDefaultView(\u收款人);
_FilteredPayes.Filter=FilterPayes;
}
私人布尔过滤器页(对象项)
{
var收款人=作为收款人的项目;
如果(收款人==null)
{
返回false;
}
如果(_settings.showInactivePayes)
{
返回true;
}
返回收款人.IsOpen;
}
}
您可以像绑定任何其他属性一样绑定属性
FilteredPayes
。优点是,您不需要两个属性,并且可以避免要绑定哪个集合的逻辑。

\u filteredpayes=newobservecollection(filteredpayes);
_filteredPayees = new ObservableCollection<Payee>(filtered);

这里您创建了一个全新的对象,而这不是ObservableCollection可以自动观察到的。可能的解决方案是在此行之后再次在GridView上设置ItemsSource。

您正在将一个新对象分配给
FilteredPayes
属性,因此必须通知
GridView
属性
FilteredPayes
已更改。在
filteredpayes
的setter中应该有
RaisePropertyChanged(“filteredpayes”)
或您的通知代码

// 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);

另外,
GridView.ItemsSource
的绑定模式不应该是
BindingMode.OneTime

简短回答:无长回答:这取决于……是否有其他代码更改
\u filteredpayes
?不幸的是,我没有使用WPF
ICollectionView
在WinRT项目中不可用。我使用的是PrismMVVM,我的
ViewModel
继承了
Prism.Mvvm.ViewModel
类。我的属性如下所示:public
observedcollection收款人{get{return}收款人;}set{base.SetProperty(ref{u收款人,value);}}
public observedcollection filteredpayes{get{return filteredpayes;}set{base.SetProperty(参考_filteredpayes,value);}
如果我使用
收款人
作为
项目来源
一切正常。即使我使用
过滤页面
并将其设置为
=\u收款人;
而不是
\u过滤页面;
。我相信这与
InotifyProperty更改
有关,但一切都与
过滤页面
有关>与收款人设置相同,并且该属性工作正常。谢谢您的建议。
_filteredPayees = new ObservableCollection<Payee>(filtered);