C#/WPF

[WPF] ListView와 SelectedItem 초기화

HJ0216 2024. 3. 31. 12:30

최근에 프로젝트를 진행하면서 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의 동작원리를 조금 더 깊게 알게 된 것 같아 뿌듯했습니다🤗.