프로그래밍/WPF

[WPF] Binding SelectedItems (ItemsControl, DataGrid 등)

흔한티벳여우 2022. 12. 7. 14:34
반응형

 ItemsControl이나 DataGrid 등의 List형 데이터를 Source로 가지는 컨트롤들은 Code behind에서 SelectedItems에 접근할 수 있다. 하지만 Xaml 에서 접근하려고 한다면 SelectedItem 만 접근 가능하다. 

 자. 이제부터 문제의 시작이다. MVVM 패턴에서 직관적으로 접근하려고 한다면 SelectedItem밖에 Binding 못한다.

하지만 여러개의 Row를 선택하고, 이러한 Row를 이용하여 어떠한 작업을 하려면 다른 방법을 써야한다.

 

DataGrid를 예를 들어 설명하도록 하겠다.

 

Xaml

<DataGrid ItemsSource="{Binding DataSource}"
          SelectedItem="{Binding SelectedData}"
          SelectionMode="Extended"
          x:Name="dgTest">
    <i:Interaction.Triggers>
        <!-- ItemsSource에서 어떤 Row든 선택하면 SelectionChanged 이벤트가 발생되니 해당 이벤트를 트리거 삼는다. -->
        <i:EventTrigger EventName="SelectionChanged">
            <!-- CommandParameter에 해당 Element에 직접 접근하여 Selecteditems를 파라미터로 땡겨온다. -->
            <i:InvokeCommandAction CommandParameter="{Binding ElementName=dgTest, Path=SelectedItems}" Command="{Binding SelectionChangeCommand}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
</DataGrid>

ViewModel

// Multi Selection이 발생됬을때 받아올 Property 선언
public List<DataClass> SelectedItems { get; set; } = new List<DataClass>();

private DelegateCommand<object> _selectionChangeCommand;
public DelegateCommand<object> SelectionChangeCommand => _selectionChangeCommand ?? (_selectionChangeCommand = new DelegateCommand<object>(ExecuteSelectionChangeCommand));

void ExecuteSelectionChangeCommand(object parameter)
{
    // xaml에서 파라미터로 받아온 데이터를 캐스팅하여 SelectedItems에 할당처리
    SelectedItems.Clear();
    IList items = (IList)parameter;
    IEnumerable<DataClass> collection = items.Cast<DataClass>();
    SelectedItems = collection.ToList();
}

 

끝!!

반응형