过滤对象C#的ObservableCollection

时间:2016-08-22 12:09:53

标签: c# xamarin xamarin.forms

我想为我的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

3 个答案:

答案 0 :(得分:2)

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

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

    classpath
  2. 如果您的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。