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
?不幸的是,我没有使用WPFICollectionView
在WinRT项目中不可用。我使用的是PrismMVVM,我的ViewModel
继承了Prism.Mvvm.ViewModel
类。我的属性如下所示:publicobservedcollection收款人{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);