выражение bind linq - PullRequest
       5

выражение bind linq

0 голосов
/ 12 июня 2010

У меня есть ListView и ObservableCollection в моем приложении wpf. Я хочу привязать выражение linq к ListView:

lv_Results.DataContext = store.Where(x => x.PR > 5).ToList();
tempStore = new M1Store()
                            {
                                SiteName = siteName,
                                Date = date,
                                url = IndexedPage,
                                TCY = YandexTCY.GetYandexTCY(IndexedPage),
                                PR = Pagerank.GetPR(IndexedPage)
                            };
            store.Add(tempStore);

Но когда я добавляю новые элементы для хранения коллекции, lv_Results не обновляется. Как я могу обновить ListView?

Ответы [ 4 ]

1 голос
/ 13 июня 2010

Ваша проблема в том, что вы хотите, чтобы условие «Где» оценивалось непрерывно для всех элементов, добавленных в коллекцию «store». Встроенный оператор LINQ «Где» не предназначен для этого. Скорее, когда он перечисляется ListView, он сканирует вашу коллекцию ровно один раз, а затем игнорирует ее.

Выезд Непрерывный LINQ . Он разработан для того, чтобы делать именно то, что вы ищете, и может использоваться почти как замена для стандартных запросов LINQ.

Ограничения встроенной реализации LINQ

Встроенные методы расширения LINQ имеют фундаментальное ограничение, заключающееся в том, что создаваемые ими коллекции не поддерживают INotifyPropertyChanged. Поэтому независимо от того, насколько сильно изменяются базовые данные, клиент никогда не получит уведомление о том, что коллекция изменилась, и, следовательно, никогда не обновит отображение данных.

Пользователь jrista указывает в комментариях, что встроенные методы LINQ действительно производят обновленные данные при повторном перечислении. Хотя это правда, это не имеет никакого практического эффекта. Ни один элемент управления WinForms или WPF не содержит кода для периодического повторного перечисления источника данных. Конечно, причины такого не очевидны: это было бы невероятно расточительно. Если вы пересчитываете 10 раз в секунду, и для перерасчета и сканирования изменений требуется 10 мс, вы будете использовать до 10% своего ЦП только для одного элемента управления!

1 голос
/ 12 июня 2010

Поместите результаты LINQ в коллекцию ObservableCollection. Привязка данных WPF и Silverlight требует, чтобы коллекции генерировали уведомления об изменениях, и ObservableCollection сделает это за вас. В противном случае вам придется реализовать это самостоятельно, что является большей болью и совершенно ненужным.

0 голосов
/ 12 июня 2010

Результаты выражения LINQ передаются в новый список (из T), который не вызывает события PropertyChanged или CollectionChanged.

Самый простой способ заставить его работать - это получить нужные результаты, а затем заполнить ObservableCollection (of T) результатами, которые вы хотите отобразить. По мере добавления ObservableCollection новые элементы будут отображаться в ListView.

0 голосов
/ 12 июня 2010

Добавьте .ToList () к вашему коду, LINQ вычисляет ленивый, поэтому он приносит результаты только при необходимости, .ToList () является жадным оператором и вызывает оценку.

[править]

Извините, неправильно понял вашу первую версию вопроса:)

Вот мое решение:

ObservableCollection<M1Store> l = store.Where(x => x.PR > 5);
lv_Results.DataContext = l;

То есть все, во всех следующих шагах, измените коллекцию Observable l:

List<M1Store> otherList = GetFromAnywhere();
otherList.ForEach(e => l.Add(e));

Здесь внутренности Observable Collection обновят listView в пользовательском интерфейсе.

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