[기초] ComboBox, ListBox 중요 프로퍼티 사용법 part1 (tistory.com)
ComboBox와 ListBox 컨트롤을 처음 접하거나, MVVM 패턴으로 사용하는 것이 익숙하지 않은 개발자를 위해 컨트롤 사용 방법을 자세하게 포스팅 하도록 하겠습니다.
1. Overview
ComboBox
: 오른쪽에 아래 화살표(?)를 클릭하여 드롭다운 목록을 보이도록 한 후 원하는 아이템을 선택할 수 있는 컨트롤로 버튼을 눌러야 데이터의 목록이 출력되며, 무조건 1개만 선택 할 수 있습니다.
더 자세한 사항은 여기를 참고하시기 바랍니다.
ListBox
: 데이터의 목록을 출력한 후 아이템을 선택할 수 있는 컨트롤로 처음부터 데이터 목록 보이며, 1개 혹은 여러개의 아이템을 선택할 수 있습니다.
더 자세한 사항은 여기를 참고하시기 바랍니다.
2. 필수 프로퍼티
ComboBox, ListBox를 사용하려면 반드시 아래 프로퍼티에 대한 내용은 알아야 합니다.
ItemsSource : 목록을 생성하는데 필요한 컬렉션을 가져오거나 설정할 수 있습니다.
SelectedItem : 선택된 아이템을 가져오거나 설정할 수 있습니다.
SelectedValue : SelectedItem에 설정된 데이터에서, SelectedValuePath에 입력된 프로퍼티의 값을 가져오거나 설정할 수 있습니다.
SelectedIndex : 선택된 아이템 혹은 아이템들 중 첫번째 항목의 인덱스를 가져오거나 설정할 수 있습니다. 선택된 아이템이 존재 하지 않는 경우 -1을 반환합니다.
DisplayMemberPath : 선택된 아이템에서 출력할 프로퍼티의 이름을 가져오거나 설정할 수 있습니다.
SelectedValuePath : 선택된 아이템에서 값을 가져올 프로퍼티의 이름을 가져오거나 설정할 수 있습니다.
3. 기본 설정
Wpf 프로젝트를 추가하고, Microsoft.Toolkit.Mvvm 누겟 패키지도 추가했습니다.
4. ItemsSource 사용
MainWindow.xaml
기본적인 내용 추가하면서 ComboBox와 ListBox에 ItemsSource에 Persons를 바인딩했습니다.
MainWindow.xaml.cs
DataContext에 MainViewModel을 생성해서 넣어 주었습니다. 이 방법은 셈플 프로젝트에서 간단하게 뷰모델을 생성해서 넣기 위해사 사용하는 방법으로 실제 사용법은 아래 링크를 참고하시기 바랍니다.
2022.02.21 - [WPF] - Microsoft.Toolkit.Mvvm을 이용한 간단한 프레임워크 part1
MainViewModel.cs
뷰모델을 간단하게 만들었습니다.
실행 화면
콤보박스가 비어있는 것은 SelectedIndex가 -1로 현재 선택된 아이템이 존재하지 않기 때문입니다. 그래서, 역삼각형을 눌르서 DropDown 리스트를 보이도록 했습니다.
리스트박스는 뷰모델의 Persons의 데이터 목록이 출력되는 것을 확인할 수 있습니다.
그런데 이렇게 출력되는 것을 원하는 것은 아니겠죠?
5. DisplayMemberPath 사용하기
콤보박스와 리스트박스에 DisplayMemberPath를 추가했습니다. 화면에 보여줄 프로퍼티는 Name입니다.
실행 화면
콤보박스와 리스트박스에 Person 모델의 Name 프로퍼티 값이 출력됩니다.
이제 DisplayMemberPath가 어떤 것인지 이해가 되시죠?
6. SelectedItem 사용하기1
콤보박스와 리스트박스에서 선택된 아이템을 가져오거나 설정할 수 있다고 했는데 아래 코드를 확인해 보죠
MainWindow.xaml
SelectedItem 프로퍼티를 SelectedListitem과 SelectedComboItem으로 바인딩을 하도록 되어있습니다.
상단 우측에는 SelectedListItem.Name과 SelectedComboItem.Name이 출력되도록 TextBlock를 추가했습니다.
그렇다면, 뷰모델에 해당 프로퍼티를 추가해 주어야 겠죠?
MainViewModel.cs
SelectedListitem와 SelectedComboItem 프로퍼티를 추가하고, 초기값을 Persons의 첫번째 아이템으로 입력했습니다.
실행화면
리스트박스에 맨 처음 아이템이 선택된 것으로 표시되며, 콤보박스에도 첫번째 아이템이 선택된 것으로 표시 됩니다.
뷰모델의 프로퍼티가 뷰에 영향을 준것을 확인할 수 있습니다.
7. SelectedItem 사용하기2
좀전의 콤보박스와 리스트박스에서 선택된 아이템을 변경하면 어떻게 될까요?
화면에서는 선택된 아이템이 변경되지만, SelectedListItem과 SelectedComboItem은 변경되지 않습니다.
화면과 뷰모델의 데이터가 서로 달라진 것을 확인할 수 있습니다. 왜 이러는 걸까요?
문제는 우리가 바인딩을 TwoWay로 하지 않았기 때문입니다. TextBox를 제외한 대부분의 컨트롤은 바인딩 기본값이 OneWay이기 때문입니다.
MainWindow.xaml
아래와 같이 TwoWay로 변경 후 다시 실행합니다.
이렇게 수정하고, 실행 후 다른 아이템을 선택해도, 화면은 그대로 입니다.
이유는?
SelectedListItem과 SelectedComboItem의 값은 변경되었지만, 뷰에서 그 프로퍼티들이 변경되었는지 여부를 판단할 수 없어서, 화면을 갱신시키지 않았기 때문입니다.
뷰가 화면을 갱신 시키기 위해서는 프로퍼티 체인지 이벤트가 필요합니다. 이제 각 프로퍼티들이 프로퍼티 체인지 이벤트를 발생시킬 수 있도록 수정해 줍니다.
MainViewModel.cs
리스트박스에 SelectedItem 프로퍼티가 변경되면, 뷰모델의 SelectedListItem 프로퍼티를 변경시키게되고, 그러면 SelectedListitem이 변경되었다는 프로퍼티 체인지 이벤트가 발생하고, 그 이벤트를 다시 뷰에 TextBlock에 바인딩되어있는 곳에서 확인하고 화면을 갱신 시켜줍니다.
8. 뷰모델에서 SelectedItem 변경여부 확인하기
리스트박스의 SelectedItem이 변경되면 SelectedListItem의 값을 변경할수 있다는 것까지는 알겠는데, 변경된 사실을 뷰모델 내부에서는 어떻게 알 수 있죠?
여기에는 2가지 방법이 존재합니다.
일반적으로는 2)번 방법을 대부분 사용하고, 1)번은 꼭 사용해야 하는 한정적인 상황에서만 사용합니다. 예를들어 SelectixxonChanged 이벤트 Arguments를 뷰모델에서 꼭 알아내서 사용해야 하는 경우입니다.
그동안 위의 두가지 방법에 대해서 정확한 개념을 못잡았던 분들은 참고하시면 좋을 것 같습니다.
여기서는 2) 방법을 이용해서 SelectedItem이 변경되었는지 여부를 확인하고, SelectedItem이 변경되었을 때 Command의 사용가능 여부를 확인하는 코드를 작성하도록 하겠습니다.
처음 실행시에는 2개의 버튼 모두 사용할 수 없는 상태로 출력됩니다. 이유는 버튼에 바인딩된 커맨드의 사용가능 여부가 false이기 때문입니다.
리스트 박스의 첫번째 아이템을 선택하고, 콤보박스에서도 첫번째 아이템을 선택했습니다. 콤보박스의 첫번째 아이템을 선택하니, Delete ComboItem 버튼이 사용가능 상태로 변경된 것이 확인 됩니다.
버튼을 클릭해서 선택된 아이템을 삭제합니다.
선택되었던 아이템이 삭제되면서, ComboBox에 선택된 아이템은 null로 변경되고, 버튼은 다시 사용하지 못하는 상태로 변경됩니다.
_persons의 목록은 2개만 추가했습니다.
9. 소스
part2에서는 SelectixxonChanged 이벤트를 이용하는 방법, SelectedValue, SelectedValuePath, SelectedIndex 사용법에 대해서 설명하도록 하겠습니다.
첫댓글