Литье выпуск | Я пытаюсь вернуть похожий тип - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть ObservableCollection UrlsList. У меня также есть флажок в моем приложении WPF, который изменяет элементы в списке, используя свойство IsChecked. Проблема, с которой я сталкиваюсь, заключается в том, что, когда я пишу несколько лямбда-выражений для фильтрации нужных мне данных, я не могу присвоить их обратно в UrlsList. Он просто устанавливает мой список в ноль, что затем приводит к сбою приложения. Спасибо за вашу помощь.

ViewModel

public ObservableCollection<URLModel> UrlsList { get; set; } = new ObservableCollection<URLModel>();

public void CheckBoxOnClick()
{
    if (URLModel.IsChecked)
        UrlsList = UrlsList.Select(url => url.ExistsInDb) as ObservableCollection<URLModel>;
    else
        UrlsList = UrlsList.Select(n => n.ExistsInDb == false) as ObservableCollection<URLModel>;
}

Warning Msg

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Вы пытаетесь привести IEnumerable<T> обратно к ObservableCollection<T>. Это неизбежно, потому что значение, возвращаемое LINQ yuery , не является наблюдаемой коллекцией.

Есть несколько проблем с вашим кодом:

  1. Вы используете Enumerable.Select, когда должны использовать Enumerable.Where. Select проецирует список в список с другими значениями (это не то, что вам нужно), тогда как Where будет фильтровать ваш список (который равен , что вы хотите).
  2. Запрос LINQ должен быть материализован, например, с помощью Enumerable.ToList или Enumerable.ToArray. Результатом Where является нематериализованный IEnumerable, выполнение которого отложено. Ваш ObservableCollection - полная коллекция.
  3. Вы не можете материализовать свой запрос 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, и тогда пользовательский интерфейс автоматически меняется вместе с ним.

0 голосов
/ 12 ноября 2018

Ваша проблема в том, что вы, по-видимому, используете Select вместо Where

Следующий список производит список IEnumerable<bool>

UrlsList.Select(url => url.ExistsInDb)

То, что вам нужно, на самом деле Where, который фильтрует список

UrlsList.Where(url => url.ExistsInDb);

Перечислимый. Выберите метод

Проецирует каждый элемент последовательности в новую форму.

Enumerable.Where Method

Фильтрует последовательность значений на основе предиката.


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