gpt4 book ai didi

c# - 过滤对象 C# 的 ObservableCollection

转载 作者:行者123 更新时间:2023-11-30 16:01:05 25 4
gpt4 key购买 nike

我想为我的 Xamarin Form 应用程序按名称过滤 Person 对象的 ObservableCollection。目标是过滤此 ObservableCollection 以仅显示其中的一部分。

这是我的 Person 对象类:

public class Person
{
public string Name { get; set; }
public string Address { get; set; }
public string Phone { get; set; }
}

我试着做一个这样的过滤器:

private ObservableCollection<Person> personItems = new ObservableCollection<Person>();

public ObservableCollection<Person> PersonItems
{
get { return personItems; }
set { personItems = value; OnPropertyChanged(); }
}

public void FilterPerson(string filter)
{
if (string.IsNullOrWhiteSpace(filter))
{
PersonItems = personItems;
}
else
{
PersonItems = personItems.Where((person) => person. Name.ToLower().Contains(filter));
// Error here
}
}

我有这个错误:

Cannot not explicitly convert type : 'System.Collections.Generic.IEnumerable' to 'System.Collections.ObjectModel.ObservableCollection

最佳答案

基本上,有两种解决方案:

  1. 如果您的 PersonsItems 列表不是很大,您可以在每次新的过滤器字符串到达​​时重新创建整个集合。在这种情况下,您甚至不需要 ObservableCollection(由于您不更改集合本身,而是更改对集合的引用)。在这种情况下,将重新创建所有 UI 元素

    PersonItems = originalItems.Where((person) => person. Name.ToLower().Contains(filter)).ToList();
  2. 如果您的 PersonsItems 列表足够大,则第一个解决方案不是一个选项。在这种情况下,您需要在应添加/删除的对象上手动调用添加/删除方法。 ObservableCollection 有一个命令式 API,它会在每次调用 Add/Remove 时触发一个事件。反过来,ItemsControl 可以观察到此事件,该事件将进行相应的 UI 更改。 Linq 有一个声明式 API。这就是为什么您需要手动同步列表以显示过滤列表。

关于c# - 过滤对象 C# 的 ObservableCollection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39079179/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com