#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.