Коллекция, которая поддерживает фильтрацию, сортировку, сортировку, добавление и удаление элементов с уведомлением - PullRequest
0 голосов
/ 26 февраля 2012

Существует ли какая-либо коллекция, которая поддерживается в Silverlight, WPF и Windows Phone, которая будет отвечать следующим критериям:

  1. принимает IEnumerable<T> в качестве источника
  2. позволяет фильтровать и сортировать элементы
  3. позволяет добавлять, редактировать и удалять элементы в отфильтрованном списке
  4. любые изменения в отфильтрованном / отсортированном списке отражаются также в исходном списке (я рассматриваю отфильтрованный / отсортированный список только как представление для коллекции источников)
  5. любые изменения в фильтрованном / отсортированном списке будут отражены в элементе управления пользовательского интерфейса (Gridview, ListView ...).

Ответы [ 2 ]

0 голосов
/ 27 февраля 2012

Вы хотите ObservableCollection. Там действительно ничего больше.

Вариант - это ваш собственный объект, который реализует IList, но внутренне выполняет все, что вам нужно Для этого вы должны создать класс, который выглядит следующим образом

class MyClass: IList, INotifyPropertyChanged
{
  //implement it
}

EDIT: Существует также объект CollectionViewSource

0 голосов
/ 26 февраля 2012

Самая универсальная коллекция - это ObservableCollection.Вы можете передать ему список в конструкторе.Через LINQ вы можете сортировать и фильтровать.Вы также можете сортировать и фильтровать в XAML, используя CollectionViewSource, но фильтрация сложна.И отдельные элементы должны реализовывать iNotitifyPropertyChanged.Я знаю только WPF.

Если вы скрываете фильтр за публичным свойством, вы можете принудительно пересмотреть его.Может привести тебя туда, где ты должен быть.

public partial class MainWindow : Window
{
    ObservableCollection<person> Persons = new ObservableCollection<person>();

    public MainWindow()
    {
        InitializeComponent();

        Persons.Add(new person("jim", 12));
        Persons.Add(new person("aa", 13));
        Persons.Add(new person("ff", 14));
        Persons.Add(new person("dd", 22));
        Persons.Add(new person("hky", 23));
        Persons.Add(new person("jsgdim", 24));

        List<person> YoungPersons = Persons.Where(per => per.Age < 20).ToList();
        Debug.WriteLine(Persons.Count.ToString());
        Debug.WriteLine(YoungPersons.Count.ToString());
        Debug.WriteLine(YoungPersonsProperty.Count.ToString());
        Persons[0].Name = "Jimmy";
        Debug.WriteLine(Persons[0].Name);
        Debug.WriteLine(YoungPersons[0].Name);
        Debug.WriteLine(YoungPersonsProperty[0].Name);
        Persons.Remove(Persons[0]);
        Debug.WriteLine(Persons.Count.ToString());
        Debug.WriteLine(YoungPersons.Count.ToString());
        Debug.WriteLine(YoungPersonsProperty.Count.ToString());

        string testName;
        DateTime startTime = DateTime.Now;        
        for (int i = 0; i < 1000000; i++)
        {
            testName = YoungPersonsProperty[0].Name;
        }
        DateTime endTime = DateTime.Now;
        TimeSpan ts = endTime - startTime;
        Debug.WriteLine(ts.Milliseconds.ToString());
    }

    public List<person> YoungPersonsProperty
    {
        get { return  Persons.Where(per => per.Age < 20).ToList(); } 
    }

    public class person : INotifyPropertyChanged
    {
        string name;
        int age;
        public event PropertyChangedEventHandler PropertyChanged;
        protected void NotifyPropertyChanged(String info)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(info));
            }
        }

        public int Age { get { return age; } }
        public string Name 
        { 
            get { return name; }
            set 
            { 
                name = value;
                NotifyPropertyChanged("Name");
            }
        }

        public person (string Name, int Age) 
        {
            name = Name;
            age = Age;
        }
    }
}

Я помню, как фильтр LINQ применялся динамически, не скрывая их за свойством, но я не помню, как.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...