오늘은 WPF DataGrid에서 선택된 항목들(SelectedItems)을 ViewModel과 바인딩하는 방법에 대해 알아보겠습니다. WPF의 DataGrid는 강력한 기능을 제공하지만, 선택된 항목들을 ViewModel에 직접 바인딩하는 기능은 제공하지 않습니다. 그러나 Blend SDK의 Behavior<T> 클래스를 활용하여 이 문제를 해결할 수 있습니다.
먼저, DataGridSelectedItemsBehavior라는 이름의 새 클래스를 생성하고, 이 클래스를 Behavior<DataGrid>로 상속합니다.
public class DataGridSelectedItemsBehavior : Behavior<DataGrid>
{
// ...
}
다음으로, SelectedItems라는 DependencyProperty를 정의합니다. 이 프로퍼티는 DataGrid의 선택된 항목들을 저장하며, Two-Way 바인딩을 지원합니다.
public static readonly DependencyProperty SelectedItemsProperty =
DependencyProperty.Register("SelectedItems", typeof(IList), typeof(DataGridSelectedItemsBehavior), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnSelectedItemsChanged));
public IList SelectedItems
{
get { return (IList)GetValue(SelectedItemsProperty); }
set { SetValue(SelectedItemsProperty, value); }
}
그 후, OnAttached()와 OnDetaching() 메서드를 오버라이드하여 DataGrid의 SelectionChanged 이벤트에 대한 처리를 추가합니다.
protected override void OnAttached()
{
base.OnAttached();
AssociatedObject.SelectionChanged += OnSelectionChanged;
}
protected override void OnDetaching()
{
base.OnDetaching();
AssociatedObject.SelectionChanged -= OnSelectionChanged;
}
OnSelectedItemsChanged() 메서드를 정의하여 SelectedItems 프로퍼티가 변경될 때 적절한 처리를 수행합니다.
private static void OnSelectedItemsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var behavior = d as DataGridSelectedItemsBehavior;
if (behavior != null)
{
behavior.SelectedItems = e.NewValue as IList;
}
}
마지막으로, OnSelectionChanged() 메서드를 구현하여 DataGrid의 선택된 항목들을 SelectedItems 프로퍼티에 동기화합니다.
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
// Check if the original source of the event is the DataGrid itself.
if (e.OriginalSource != sender) return;
if (SelectedItems != null)
{
foreach (var item in e.AddedItems)
{
if (!SelectedItems.Contains(item))
{
SelectedItems.Add(item);
}
}
foreach (var item in e.RemovedItems)
{
if (SelectedItems.Contains(item))
{
SelectedItems.Remove(item);
}
}
}
}
이제 XAML 코드에서 DataGridSelectedItemsBehavior를 사용하여 DataGrid의 SelectedItems를 ViewModel과 바인딩할 수 있습니다.
<Window ...
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:local="clr-namespace:YourNamespace">
<!-- ... -->
<DataGrid ItemsSource="{Binding YourItemsSource}" AutoGenerateColumns="False">
<i:Interaction.Behaviors>
<local:DataGridSelectedItemsBehavior SelectedItems="{Binding SelectedItemsInViewModel}" />
</i:Interaction.Behaviors>
<!-- ... -->
</DataGrid>
<!-- ... -->
</Window>
위의 코드에서는 DataGrid의 SelectedItems를 ViewModel의 SelectedItemsInViewModel 프로퍼티와 바인딩하고 있습니다. 이렇게하면 ViewModel에서 선택된 항목들을 직접 조작할 수 있게 됩니다.
이상으로 WPF DataGrid에서 SelectedItems를 ViewModel과 바인딩하는 방법에 대해 설명했습니다. 이 방법을 사용하면 ViewModel에서 선택된 항목들을 쉽게 관리할 수 있으며, MVVM 패턴에 더 잘 어울리게 됩니다.
'프로그래밍 > WPF' 카테고리의 다른 글
[WPF] DataGrid DataGridTemplateColumn 사용시 Ctrl+C (복사하기) 기능 (0) | 2023.05.22 |
---|---|
[WPF] 여러 Enum 상태에 따라 선택적으로 UserControl 표시하기 (0) | 2023.04.12 |
[WPF] Converter를 이용한 Binding Image Source (0) | 2023.03.23 |
[오류해결] Brush - DependencyObject와 같은 스레드에서 DependencySource를 만들어야 합니다. (0) | 2022.12.21 |
[WPF] Close popup when mouse leave (0) | 2022.12.20 |