C#/WPF (MVVM)

[C# / WPF / MVVM / Prism] ListBox, ListView 선택한 아이템 찾기

F급 개발자 2024. 6. 23. 20:59
728x90
반응형

안녕하세요. 오늘은 C# WPF Prism을 이용해서 ListBox 혹은 ListView의 선택한 아이템을 찾는 방법을 알아보도록 하겠습니다.

 

 A.xmal 코드입니다.

 <ListView ItemsSource="{Binding Items}">
      <i:Interaction.Triggers>
         <i:EventTrigger EventName="SelectionChanged">
             <prism:InvokeCommandAction Command="{Binding SelectCommand}" CommandParameter="{Binding SelectedItem, RelativeSource={RelativeSource AncestorType=ListView}}" />
         </i:EventTrigger>
     </i:Interaction.Triggers>
       <ListView.ItemTemplate>
           <DataTemplate>
               <WrapPanel>
                   <materialDesign:PackIcon
                       Width="20"
                       Height="20"
                       HorizontalAlignment="Center"
                       VerticalAlignment="Center"
                       Kind="{Binding SetMainIcon}" />
                   <materialDesign:PackIcon
                       HorizontalAlignment="Center"
                       VerticalAlignment="Top"
                       Kind="{Binding SetSubIcon}" />
                   <TextBlock
                       Width="120"
                       HorizontalAlignment="Center"
                       VerticalAlignment="Center"
                       Text="{Binding SetName}" />
               </WrapPanel>
           </DataTemplate>
       </ListView.ItemTemplate>
   </ListView>

 

바인딩 과정은 생략하도록 하겠습니다. 혹여나 필요하시다면, 댓글로 알려주세요.

 

A_ViewModel.cs 입니다.

     
   	public ICommand SelectCommand => new DelegateCommand<object>(SelectedItem);    

     
     private void SelectedItem(object obj)
     {
         if (obj is A_LisBox { SetName: not null } item)
         {
             var index = FindIndexByName(item.SetName);

             if (index != -1)
             {
                 //찾는 아이템 데이터 처리
             }
         }
     }
    
    private int FindIndexByName(string name)
    {
        var item = items.FirstOrDefault(x => x.SetName == name);
        if (item == null) return -1;
        return items.IndexOf(item);
    }

 

간략하게 설명드리면 A.xaml에서 EventTrigger의 이벤트를 ViewModel에서 ICommand <Object>선언하여 내용을 받아 옵니다.  

 

SelectedItem(object obj) 함수내 if문은 object에서 받아온 내용중 내가 찾고 싶은 아이템이 null이 아닌지 확인 후에 if문 안으로 들어오게됩니다.

 

FindIndexByName(string name) 아이템 중 일치한지 확인 후 해당하는 Index 값을 int값으로 리턴 시킵니다.

 

ListBox, ListView 모두 똑같은 방식이지만 차이점은 아래의 xaml를 참고하시면 됩니다.

<!--ListView-->  
  <i:Interaction.Triggers>
         <i:EventTrigger EventName="SelectionChanged">
             <prism:InvokeCommandAction Command="{Binding SelectCommand}" CommandParameter="{Binding SelectedItem, RelativeSource={RelativeSource AncestorType=ListView}}" />
         </i:EventTrigger>
  </i:Interaction.Triggers>
<!--ListView-->  
  
<!--ListBox-->  
  <i:Interaction.Triggers>
         <i:EventTrigger EventName="SelectionChanged">
             <prism:InvokeCommandAction Command="{Binding SelectCommand}" CommandParameter="{Binding SelectedItem, RelativeSource={RelativeSource AncestorType=ListBox}}" />
         </i:EventTrigger>
  </i:Interaction.Triggers>
<!--ListBox-->

 

 

최근 프로젝트하다가 많이 쓰게되어서 혹시나 싶어 도움될까 작성하니 참고하여 쓰시길 바랍니다.

 

혹여나 틀린 부분은 피드백 해주시면 수정하겠습니다! 감사합니다.

728x90
반응형