[WPF] ListView와 SelectedItem 초기화
최근에 프로젝트를 진행하면서 ListView Control을 하며 어려웠던 부분을 정리하였습니다.
👉 기본 환경
- Language: C#, xaml
- IDE: Visual Basic 2022
- Framework: .NET 8.0
사내 프로젝트도 어느덧 막바지를 향해 가고 있습니다.
설계팀으로부터 테스트 결과를 받았습니다.
Click 이벤트 컨트롤이 잘 되지 않아 해결을 하고, 그 해결은 또 다른 문제를 불러오게 되는데..
의 굴레에서 빠져나온 이야기를 짧게 정리해보고자 합니다✍️.
상황:
1. ListView에서 Item을 클릭했을 때, 데이터를 로드하고,
2. DataContext로 연결한 ViewModel에 로드된 데이터를 넘겨주면서
3. Window를 여는 것이었습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
private void ClickItemEvent()
{
// 생략
if(SelectedItem != null && SelectedItem.Title != null)
{
LoadDataModel(SelectedItem);
WindowDetails windowDetails = new WindowDetails();
windowDetails.DataContext = new ViewModelDetails(SelectedDataModel);
windowDetails.ShowDialog();
}
}
|
문제:
기존에 ClickItemEvent가 1번이라도 발생해서 SelectedItem이 설정되면,
더블클릭을 통한 창 최대/최소 시에 ListView가 클릭된 것처럼 windowDetails 창이 열렸습니다.
SelectedItem이 null값일 때, window가 열리지 않도록 유효성 검사를 조건으로도 해결할 수 없는 문제였기에 다른 해결책이 필요했습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
private void ClickAddinItemEvent()
{
// 생략
if(SelectedItem != null && SelectedItem.Title != null)
{
LoadDataModel(SelectedItem);
WindowDetails windowDetails = new WindowDetails();
windowDetails.DataContext = new ViewModelDetails(SelectedDataModel);
windowDetails.ShowDialog();
// Initialize Data
SelectedItem = new ItemModel();
}
}
|
해결1:
새로운 ItemModel()로 초기화
→ 부정확한 click 이벤트에 대해서는 windowDetails가 열리지 않음
🚨 그러나, 같은 SelectedItem을 클릭했을 때, windowDetails가 열리지 않음
🤓 이유:
ListView의 총 3개의 ListViewItem이 있다고 가정했을 때,
* ItemA
* ItemB
* ItemC
ItemA에 대한 SelectedItem의 참조값이 0001 일 때, 새로운 인스턴스로 초기화하며 종료했으므로 0002로 변경
* ItemA: 0001 → 0002
* ItemB: 0003
* ItemC: 0004
새로운 Item인 B나 C를 선택했을 때는 참조값이 변경되면서 변화를 인식하지만,
동일한 Item인 A를 클릭했을 때는 이미 빈 참조값인 0002로 초기화되었기 때문에 변화를 인식하지 못함
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
private void ClickAddinItemEvent()
{
// 생략
if(SelectedItem != null && SelectedItem.Title != null)
{
LoadDataModel(SelectedItem);
WindowDetails windowDetails = new WindowDetails();
windowDetails.DataContext = new ViewModelDetails(SelectedDataModel);
windowDetails.ShowDialog();
// Initialize Data
SelectedItem = null;
}
}
|
해결2:
null로 초기화
→ 참조값이 없어지므로 동일한 Item을 클릭해도 SelectedItem의 변화가 인식됨
✍️ 값 초기화를 null로 하지 않기 위해 새로운 인스턴스를 사용헀는데, 오히려 동작인식이 되지 않아 새로운 문제가 발생했었습니다. 이에 대해 오히려 WPF의 동작원리를 조금 더 깊게 알게 된 것 같아 뿌듯했습니다🤗.