Вы пытаетесь привести IEnumerable<T>
обратно к ObservableCollection<T>
. Это неизбежно, потому что значение, возвращаемое LINQ yuery , не является наблюдаемой коллекцией.
Есть несколько проблем с вашим кодом:
- Вы используете
Enumerable.Select
, когда должны использовать Enumerable.Where
. Select
проецирует список в список с другими значениями (это не то, что вам нужно), тогда как Where
будет фильтровать ваш список (который равен , что вы хотите).
- Запрос LINQ должен быть материализован, например, с помощью
Enumerable.ToList
или Enumerable.ToArray
. Результатом Where
является нематериализованный IEnumerable
, выполнение которого отложено. Ваш ObservableCollection
- полная коллекция.
- Вы не можете материализовать свой запрос LINQ с приведением типа. Вы должны создать коллекцию самостоятельно.
Учитывая все эти проблемы, ваш код будет:
public void CheckBoxOnClick()
{
if (URLModel.IsChecked)
UrlsList = new ObservableCollection<URLModel>(UrlsList.Where(url => url.ExistsInDb));
else
UrlsList = new ObservableCollection<URLModel>(UrlsList.Where(url => !url.ExistsInDb));
}
Более тонкая ошибка в этом коде заключается в том, что при установке и снятии флажка ваш список URL-адресов будет пустым, поскольку сначала вы выбираете только отмеченные элементы в списке, а затем выбираете непроверенные элементы из этот список. Поскольку вы уже отфильтровали список для отмеченных элементов, ваш второй выбор не даст результата. Вам нужно будет сохранить оригинальный список где-нибудь еще и выбрать оттуда:
public void CheckBoxOnClick()
{
if (URLModel.IsChecked)
UrlsList = new ObservableCollection<URLModel>(allUrls.Where(url => url.ExistsInDb));
else
UrlsList = new ObservableCollection<URLModel>(allUrls.Where(url => !url.ExistsInDb));
}
Другая проблема заключается в том, что если вы не измените список где-либо еще, вам не понадобится ObservableCollection
, поскольку вы переназначаете список при смене флажка. Вы можете использовать простой List<T>
или массив, или - и именно для этого на самом деле предназначена привязка данных - вы изменяете содержимое привязки данных ObservableCollection
, и тогда пользовательский интерфейс автоматически меняется вместе с ним.