2016-10-27 3 views
0

Есть ли способ, чтобы выбранные предметы в ListBox как ListBoxItem в случае SelectionChanged (на ListBox) в WPF?WPF ListBox.SelectedItems как ListBoxItem

Прямо сейчас, когда я звоню listBox.SelectedItems Я получаю список элементов в формате моего источника данных.

Например, когда я создаю мой ListBox я привязать его к CustomListBoxViewModel в качестве источника данных, поэтому, когда я назвал SelectedItems я получить список CustomListBoxViewModel объектов.

Спасибо!

EDIT:

код, который был дан в выбранном ответе работал отлично для моего случая использования.

С другой стороны, я полностью понимаю, что это нарушение шаблона MVVM. Я буду использовать код, который вы указали в коде, за которым стоит представление xaml.

Причина моего первоначального вопроса состояла в том, что мне нужно реализовать ListBox, у которого есть некоторые отключенные ListBoxItems внутри. Эти предметы должны быть не поддающимися выбору.

Я попытался использовать прилагаемую собственность IsSelectable на моем ListBoxItems, и это не сработало. Это свойство было очень вдохновлено этим post. Проблема заключалась в том, что когда я сразу выбирал отключенный элемент, вложенное свойство работало отлично. Элемент не может быть выбран, и он не находится внутри коллекции SelectedItems. Но если бы я хотел выбрать все предметы, нажав CTRL + A, все ListBoxItems были выбраны даже отключенными и были найдены в коллекции SelectedItems.

+0

Нет, это не так, как это работает. – Will

+0

@ Могу ли я обновить вопрос по той причине, что я хочу это сделать. Это «лучший» способ сделать это, я думал ... Может быть, есть лучший способ сделать это? – EverydayLearner

ответ

4

Независимо от причины, по которой вы это делаете, это, вероятно, серьезное нарушение MVVM, о котором вы будете горько сожалеть всю оставшуюся жизнь.

Но первый шаг на пути к погибели всегда легкий.

Вот как:

var listBox = (ListBox)sender; 
var selectedListBoxItems = 
    listBox.SelectedItems.Cast<Object>() 
    .Select(item => (ListBoxItem)listBox.ItemContainerGenerator.ContainerFromItem(item)) 
    .ToList(); 

Просто не приходят ко мне с плачем, когда это все заканчивается слезами.

Нет, но серьезно, есть : есть несколько веских причин, чтобы сделать это в WPF, но они гораздо менее распространены, чем ожидали бы новые пользователи WPF. Практически любой нормальный случай лучше всего обрабатывать, если ваш код C# взаимодействует только с вашими элементами данных, и делайте материал в ListBoxItems в XAML через стили и шаблоны. Как только вы привыкнете к такому мышлению, он очень мощный, гибкий, продуктивный и поддерживаемый. Codebehind - это то, что вы делаете для странных случаев, когда все другие разумные пути проваливаются. Например, перетаскивание.

+1

Я полностью понимаю, что это плохо. Я добавил причину, по которой я спрашивал об этом при редактировании моего вопроса. Возможно, есть лучший способ сделать это. – EverydayLearner

+1

@m.lachance Читая ваш обновленный вопрос, моя первая реакция: «О, мужик, просто перепутай это с кодовым именем». Это определенно то, что вы часто делаете в Codebehind - решение с прикрепленным имуществом может быть лучше, но очень часто в реальном мире расписание просто не позволяет вам строить Parthenon. Но украсть Парфенон - другое дело; Я посмотрю на это сообщение coderelief.net и посмотрю, работает ли этот код для меня. –

Смежные вопросы