LINQ и статическая наблюдаемая коллекция

#vb.net #linq #observablecollection

#vb.net #linq #наблюдаемая коллекция

Вопрос:

Вероятно, это будут основные вопросы для экспертов по LINQ и архитектуре, однако я не могу понять проблему, с которой я столкнулся при попытке обновить ‘Static ObservableCollection.

  Me.Grid1.ItemsSource = ContactList

 Me.Grid2.ItemsSource = From s In ContactList Where s.ContactTypes.Any(Function(t) t.ContactTypeName = "Christmas List")
  

Если я добавлю новый контакт с типом контакта «Рождественский список» в список контактов ObservableCollection, Grid1 отразит дополнительный контакт, однако Grid2 не отразит изменения, если я не выполню повторную привязку.

В любом случае, чтобы отразить изменение в Grid2, чтобы показать новый контакт с запрошенным типом контакта

Ответ №1:

Grid2 фактически привязывается к IEnumerable (Of Contact) вместо наблюдаемой коллекции. Вот почему изменение не отражается в Grid2. Вам нужно заставить ваш запрос Linq повторно выполняться с использованием события или INotifyPropertyChanged.

Комментарии:

1. Я думаю, поскольку я использую сетку Telerik, я мог бы просто передать фильтр функции FilterDescriptor, но просто имея Grid1 и Grid2, указывающие на одну и ту же коллекцию, и использовать пользовательский FilterDescriptor с Grid2. Спасибо за предоставление знаний по базовой архитектуре Linq. Большое спасибо

Ответ №2:

Это может происходить из-за характера отложенного выполнения запроса LINQ. Значения извлекаются только тогда, когда вы начинаете перечислять результирующий набор. Вот почему вам нужно повторно привязать источник данных, чтобы увидеть изменения. Попробуйте добавить ToList(), метод в конце запроса. Например,

 Me.Grid2.ItemsSource = From s In ContactList Where s.ContactTypes.Any(Function(t) t.ContactTypeName = "Christmas List").ToList();
  

Комментарии:

1. Я пробовал это, но с теми же результатами. Я думаю, что приведенный выше ответ правильный. Я изучаю Rx, чтобы посмотреть, принесет ли это какую-либо пользу. Все равно спасибо

Ответ №3:

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

 Me.Grid2.ItemsSource = ContactList.Filtering(c => c.ContactTypes.ContainsComputing("Christmas List").Value); 
  

Метод расширения фильтрации возвращает экземпляр ObservableCollection и отражает все изменения в коллекции ContactList и коллекции ContactTypes. При написании кода выше я предположил, что contactContactTypes имеет идентификатор ObservableCollection. Если это не так, то вы можете кодировать:

 Me.Grid2.ItemsSource = ContactList.Filtering(c => c.ContactTypes.Contains("Christmas List")); 
  

В этом случае не забудьте добавить реализацию интерфейса INotifyPropertyChanged в класс Contact, чтобы результат ObservableCollection отражал изменение контакта.Свойство ContactTypes.