Фильтр ObservableCollection - PullRequest
       2

Фильтр ObservableCollection

4 голосов
/ 06 сентября 2011

Я очень новичок в кодировании и пытаюсь научиться кодировать для Windows Phone.Я застрял в проблеме с прошлой недели, и это сводит меня с ума.

У меня есть ObservableCollection, определенный так:

public ObservableCollection<Note> Items { get; private set; }

В классе Note есть две переменныев нем называются Index и Category.

Я хочу отфильтровать ObservableCollection, чтобы я мог выбрать из него определенный элемент.

Есть ли простой способ сделать это?Любая помощь будет принята с благодарностью!

Ответы [ 5 ]

4 голосов
/ 06 сентября 2011

вы можете сделать:

var myCollection = GetNoteCollection(...);

var result = myCollection.Where(w => w.Category.Equals("MyCategory"));
3 голосов
/ 06 сентября 2011

Обновление : эти классы больше не доступны, проверьте ObservableCollectionView

Оригинальный ответ
Попробуйте один из следующих классов:OrderedObservableCollection или FilteredObservableCollection

OriginalList = new ObservableCollection<Person>();
FilteredList = new OrderedObservableCollection<Person, int>(originalList, p => p.Age, a => a.Age >= 18);

* FilteredList содержит только лиц в возрасте> = 18 лет, и все люди отсортированы по возрасту.FilteredList будет автоматически обновляться, если что-то изменится в OriginalList.Если OriginalList является глобальным и FilteredList используется на странице, вам нужно вызвать FilteredList.Unload(), чтобы удалить привязку события - это необходимо для того, чтобы сборщик мусора мог освободить FilteredList.

Эти классы не полностью протестированы, если вы обнаружите проблему, сообщите об этом здесь.

Кстати: я не доволен методом Unload().Можно ли добавить что-то вроде слабой ссылки на событие?

2 голосов
/ 06 сентября 2011

Вы не говорите, что хотите отфильтровать.Но независимо от того, посмотрите на LINQ Enumerable.Where и Enumerable.FirstOrDefault

Пример:

var answerToLifeTheUniverseAndEverything = Items.FirstOrDefault(note => note.Index == 42)
1 голос
/ 12 января 2012

Я думаю, что вы хотите использовать CollectViewSource.Они поддерживаются в Windows Phone 7.1.Вы можете создать его, обернуть свой ObservableCollection и установить его в качестве привязываемого свойства в ViewModel.Я собираюсь попробовать это сам.Если ты хочешь знать, как я живу, дай мне знать.

0 голосов
/ 22 марта 2015

Я думаю, вам следует использовать ListCollectionView и List <> с вашим ObservableCollection свойством:

1-Binding ListCollectionView для того же источника данных, что и ObservableCollection as:

ListCollectionView lvs;
var note = from n in Note select n;
        lvs = new ListCollectionView(note.ToList <Note>());

2 - метод создания фильтра:

public bool ItemIndexFilter(object obj)
    {
        Note note = obj as Note;
        return (note.Index>=10);
    }

3- Присвоение свойству Items его отфильтрованного значения:

lvs.Filter = new Predicate<object>(ItemIndexFilter);
List<Note> note_list = new List<Note>();
for (int i = 0; i < lvs.Count; i++)
     {                   
        note_list.Add((Note)lvs.GetItemAt(i));    
     }
var observe = new ObservableCollection<Note>(note_list);
items=observe;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...