我想为我的Xamarin表单应用程序按名称过滤ObservableCollection
Person
个对象。
目标是过滤此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
}
}
我有这个错误:
无法显式转换类型: &#39; System.Collections.Generic.IEnumerable&#39;至 &#39; System.Collections.ObjectModel.ObservableCollection
答案 0 :(得分:2)
基本上,有两种解决方案:
如果您的PersonsItems列表不是很大,您可以在每次新的过滤字符串到达时重新创建整个集合。在这种情况下,您甚至不需要ObservableCollection(由于您不更改集合本身,因此您更改了对集合的引用)。在这种情况下,将重新创建所有UI元素
classpath
如果您的PersonsItems列表足够大,则第一个解决方案不是一个选项。在这种情况下,您需要在应添加/删除的对象上手动调用添加/删除方法。 ObservableCollection有一个命令式API,每次调用Add / Remove时都会触发一个事件。反过来,ItemsControl可以观察到这个事件,它将进行相应的UI更改。 Linq有一个声明性API。这就是为什么你需要手动同步列表以显示过滤列表。
答案 1 :(得分:1)
为了做到这一点,我曾使用James Montemagno的ObservableRangeCollection和Grouping帮助函数。您可以在此插件https://github.com/jamesmontemagno/mvvm-helpers
中找到它们答案 2 :(得分:0)
PersonItems = personItems.Where((person) => person. Name.ToLower().Contains(filter));
正在返回IEnumerable。
将其替换为PersonItems = new ObservableCollection<Person>(personItems.Where((person) => person.Name.ToLower().Contains(filter)));
您必须使用过滤结果重新创建observable。