2010-06-30 2 views
2

Я приговариваю к роману, но я хотел объяснить столько, сколько я сделал до сих пор.Как удалить предметы из коллекции Observable

В моем текущем проекте у меня есть приложение, которое использует услугу, предоставляющую коллекцию как <List>. Из-за того, как я использую эти данные в приложении, мне пришлось преобразовать эти данные в наблюдаемую коллекцию. Это было сделано для того, чтобы при выборе и перемещении данных об обновлениях пользовательского интерфейса приложения обновлялись с использованием INotifyPropertyChanged и INotifyCollectionChanged.

У меня теперь есть вызов, который связан с наблюдаемой коллекцией в списке. У меня есть шаблон данных, который выделяет элементы коллекции. Этот шаблон данных содержит кнопку, которая должна позволить пользователю щелкнуть по кнопке для каждого элемента, чтобы удалить их из коллекции. В этом случае используется список, в котором выбрано выбранное имя из сетки. После того как пользователь выбрал имена из gridview, они сохраняются (в пределах наблюдаемой коллекции как очередь) и отображаются в пользовательском интерфейсе в элементе управления списком, который показывает все выбранные имена. Мне нужно предоставить пользователю возможность удалять эти имена в любом выбранном порядке.

Из того, что я читал, нет средств для перечисления/индексации наблюдаемой коллекции. В таких ситуациях вы должны использовать List или Array. Однако для того, чтобы элементы обновлялись в виде списка, они должны быть в коллекции Observable. Из того, что я прочитал, кажется, что при запуске события мне нужно преобразовать наблюдаемую коллекцию в массив и затем оценить массив для определения индекса, а затем удалить запись соответственно?

Я думаю, что, возможно, я не согласен с этим, поскольку мне кажется, что я над разработкой этой проблемы? Вышеупомянутый сценарий не кажется правильным, потому что я упал так, как будто я делаю много конвертирования в коллекции и из них, чтобы просто удалить запись? Кто-нибудь знает об эффективном способе удаления записей из коллекции (в любом выбранном порядке), когда коллекция отображается как элемент управления в списке? Мне удалось удалить последнюю запись, добавленную в коллекцию с помощью RemoveAt(), однако я не успел случайно удалить записи.

Запоздалая мысль: Часть этой проблемы может быть связана с тем, что у меня есть кнопка, вставленная в DataTemplate (пункт управления), в результате чего элемент фактически не выбран до того, как событие вызывается по кнопке мероприятие? Извините за бессвязное отношение к этому, но у меня была голова в этом часами и сделал небольшой прогресс. Любые советы или идеи будут оценены!

+3

Этот вопрос слишком велик. Вы сделаете это справедливо, если сможете решить реальный вопрос. И FYI, я понятия не имею, где вы читаете, вы не можете индексировать или перечислять ObservableCollection. Конечно, вы можете использовать все методы 'ICollection ' (IndexOf, индексный указатель и т. Д.). –

+0

Спасибо Адаму и да простите за длинный роман. Я попытался дать слишком подробный описательный вопрос, и это оказалось более запутанным, чем сжатым. Еще раз спасибо за советы по ICollection – rlcrews

ответ

5

ObservableCollection<T> наследует от Collection<T>, который реализует IList<T>, так что вы можете, конечно, индексировать и перечислять его. Он имеет метод Remove, который берет объект для удаления и удаления первого вхождения в коллекции и метода RemoveAt, который принимает индекс и удаляет элемент в этом индексе.

Основываясь на вашей запоздалой мысли, это похоже на то, что у вас есть ListBox WPF с ItemTemplate, который создает кнопку. ListBox будет устанавливать DataContext каждого экземпляра-шаблона в элемент, связанный с ним, поэтому вы можете получить ссылку на элемент, который создал кнопку из свойства DataContext на Button или с помощью привязки.

+0

Спасибо Quarermeister. После некоторых дополнительных исследований я вернулся и повторно обработал шаблон и удалил кнопку из шаблона. Это позволило мне использовать SelectedItem из элемента управления, и я переместил кнопку в список. Хотя немного отличается визуально. Он работает без проблем. Спасибо за совет. – rlcrews