반응형
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();
}
끝!!
반응형
'프로그래밍 > WPF' 카테고리의 다른 글
[오류해결] Brush - DependencyObject와 같은 스레드에서 DependencySource를 만들어야 합니다. (0) | 2022.12.21 |
---|---|
[WPF] Close popup when mouse leave (0) | 2022.12.20 |
[WPF] File Drag & Drop MVVM Pattern using Behavior (0) | 2022.12.07 |
[WPF] Return StaticResource as IValueConverter (0) | 2022.12.02 |
[WPF] ContextMenu Binding in TreeView (0) | 2022.11.28 |