2016-10-27 5 views
0

WPF에서 SelectionChanged (ListBox) 이벤트에 ListBox의 선택된 항목을 ListBoxItem으로 표시하는 방법이 있습니까?WPF ListBox.SelectedItems as ListBoxItem

바로 지금 listBox.SelectedItems으로 전화하면 데이터 원본 형식의 항목 목록이 표시됩니다. 내가 만들 예를 들어

, 내 ListBox 나는 데이터 소스로 CustomListBoxViewModel에 바인딩, 그래서 SelectedItems을 부를 때 나는 CustomListBoxViewModel 개체의 목록을 얻을.

감사합니다.

편집 : 내 사용 사례에 대해 완벽하게 작동 선택한 답에 주어졌다

코드입니다.

한편 MVVM 패턴을 위반하는 것으로 완전히 이해합니다. xaml 뷰의 코드 뒤에 제공 한 코드를 사용하겠습니다.

원래 질문의 이유는 ListBoxItems이 비활성화 된 ListBox을 구현해야한다는 것이 었습니다. 그 항목들은 선택을 취소해야합니다.

첨부 파일 이 내 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# 코드가 데이터 항목과 만 상호 작용하도록하여 가장 잘 처리되며 스타일 및 템플릿을 통해 XAML의 ListBoxItem에 처리합니다. 그런 사고 방식에 익숙해지면 매우 강력하고 유연하며 생산적이며 유지 보수가 용이합니다. Codebehind는 다른 모든 합리적인 수단이 실패한 이상한 경우를 위해 수행하는 작업입니다. 예를 들어 드래그 앤 드롭.

+1

나는 그것이 나쁘다는 것을 완전히 이해합니다. 나는 나의 질문을 편집 할 때 이것을 묻는 이유를 덧붙였다. 어쩌면 이것을하는 더 좋은 방법이있을 것입니다. – EverydayLearner

+1

@m.lachance 업데이트 된 질문을 읽고, 나의 첫 번째 반응은 "Oh, man, codebehind에서 kludge"입니다. 이것은 코드 숨김에서 종종하는 일종의 일입니다. 부착 된 부동산 솔루션이 더 좋을 수도 있지만 실제로는 현실 세계 일정으로는 파르테논을 구축 할 수 없습니다. 그러나 파르테논을 훔치는 것은 또 다른 문제입니다. 그 coderelief.net 게시물을보고 그 코드가 나를 위해 작동하는지 확인하겠습니다. –