DataGrid: 더블 클릭으로 DataRow를 Select 하는 방법

2023. 4. 28. 13:30· WPF
목차
  1. ✅ Behavior를 사용한 DataGrid 더블 클릭 이벤트
  2. UIHelper.cs
  3. DataGridDoubleClickBehavior.cs
  4. Model
  5. ViewModel
  6. xaml 사용법
  7. ✅ Behavior를 사용한 DataGrid 더블 클릭 이벤트 - 끝
  8. 관련 포스팅

MVVM패턴에서 View에서 발생한 DataGrid의 더블클릭 이벤트를 DataGrid.InputBindings으로 받을 수 있습니다. 하지만 더블클릭 이벤트의 발생만 알 수 있고 선택한 DataGridRow를 ViewModel로 전달할 수는 없습니다. 더블클릭 시 선택한 DataGridRow를 ViewModel에 전달하는 예제코드입니다.

 

 


 

 

✅ Behavior를 사용한 DataGrid 더블 클릭 이벤트

 

NuGet 패키지 관리자를 사용하여 Microsoft.Xaml.Behaviors.Wpf 패키지를 프로젝트에 추가해야 합니다.

 

 

UIHelper.cs

namespace MVVM
{
    public static class UIHelpers
    {
        public static T TryFindParent<T>(DependencyObject child) where T : DependencyObject
        {
            DependencyObject parentObject = GetParentObject(child);
        
            if (parentObject == null) return null;
        
            T parent = parentObject as T;
            if (parent != null)
            {
                return parent;
            }
            else
            {
                return TryFindParent<T>(parentObject);
            }
        }
                
                
                
        public static DependencyObject GetParentObject(DependencyObject child)
        {
            if (child == null) return null;
            ContentElement contentElement = child as ContentElement;
        
            if (contentElement != null)
            {
                DependencyObject parent = ContentOperations.GetParent(contentElement);
                if (parent != null) return parent;
        
                FrameworkContentElement fce = contentElement as FrameworkContentElement;
                return fce != null ? fce.Parent : null;
            }
        
            return VisualTreeHelper.GetParent(child);
        }
                
                
                
        public static void UpdateBindingSources(DependencyObject obj, params DependencyProperty[] properties)
        {
            foreach (DependencyProperty depProperty in properties)
            {
                BindingExpression be = BindingOperations.GetBindingExpression(obj, depProperty);
                if (be != null) be.UpdateSource();
            }
        
            int count = VisualTreeHelper.GetChildrenCount(obj);
            for (int i = 0; i < count; i++)
            {
                DependencyObject childObject = VisualTreeHelper.GetChild(obj, i);
                UpdateBindingSources(childObject, properties);
            }
        }
        
        
        public static T TryFindFromPoint<T>(UIElement reference, Point point) where T : DependencyObject
        {
            DependencyObject element = reference.InputHitTest(point) as DependencyObject;
            if (element == null) return null;
            else if (element is T) return (T)element;
            else return TryFindParent<T>(element);
        }
    }
}

View에서 특정 UI 요소를 검색하는 Class입니다.

원본 소스코드는 파일로 첨부합니다.

 

UIHelpers.cs
0.00MB

 

 

 

 

 

 

DataGridDoubleClickBehavior.cs

public class DataGridDoubleClickBehavior : Behavior<DataGrid>
{
    protected override void OnAttached()
    {
        base.OnAttached();
        AssociatedObject.MouseDoubleClick += AssociatedObject_MouseDoubleClick;
    }

    private void AssociatedObject_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    {
        DataGrid dataGrid = (DataGrid)sender;
        var dgRow = UIHelpers.TryFindFromPoint<DataGridRow>(dataGrid, point: e.GetPosition(dataGrid));
        dataGrid.SelectedIndex = dgRow.GetIndex();
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();
        AssociatedObject.MouseDoubleClick -= AssociatedObject_MouseDoubleClick;
    }
}

Behavior에 MouseDoubleClick을 등록하여 동작을 정의합니다.

UIHelpers 클래스를 통해 클릭한 마우스 위치의 control을 찾습니다.

 

 

 

Model

public class SomeData
{
    public int Number { get; set; }
    public string Name { get; set; }
}

 

 

 

 

ViewModel

private ObservableCollection<SomeData> _someDataCollection = new ObservableCollection<SomeData>();
public ObservableCollection<SomeData> SomeDataDataCollection
{
    get => _someDataCollection;
    set { _someDataCollection = value; OnPropertyChanged(nameof(SomeDataDataCollection)); }
}

private SomeData _selectedItemVm;
public SomeData SelectedItemVm
{
    get => _selectedItemVm;
    set { 
        _selectedItemVm = value; 
        OnPropertyChanged(nameof(SelectedItemVm));
        OnSelectedDataGridItemChanged(_selectedItemVm);
    }
}

public MainViewModel()
{
	// 테스트 데이터 생성
    for (int i = 0; i < 50; i++)
    {
        SomeDataDataCollection.Add(new SomeData() { Name = $"name({i})", Number = i + 1 });
    }
}

private RelayCommand<object> _selectedDataGridItemChangedCommand;
public RelayCommand<object> SelectedDataGridItemChangedCommand
{
    get
    {
        if (_selectedDataGridItemChangedCommand == null)
            _selectedDataGridItemChangedCommand = new RelayCommand<object>(OnSelectedDataGridItemChanged);
        return _selectedDataGridItemChangedCommand;
    }
}

private void OnSelectedDataGridItemChanged(object obj)
{
	// Do something.
}

OnSelectedDataGridItemChanged 가 호출될 때 _selectedItemVm와 obj에 선택된 DataGridRow가 들어있습니다.

 

 

 

 

 

 

xaml 사용법

<xmlns:behavior="http://schemas.microsoft.com/xaml/behaviors">

<DataGrid ItemsSource="{Binding SomeDataCollection}">
    <behavior:Interaction.Behaviors>
        <local:DataGridDoubleClickBehavior/>                
    </behavior:Interaction.Behaviors>
</DataGrid>

 

 

 

 

 

✅ Behavior를 사용한 DataGrid 더블 클릭 이벤트 - 끝

 

 

관련 포스팅

DataGrid: 배경색으로 Row를 구분하는 간단한 방법 #1

DataGrid: 배경색으로 Row를 구분하는 간단한 방법 #2

 

 

 

 

 

  1. ✅ Behavior를 사용한 DataGrid 더블 클릭 이벤트
  2. UIHelper.cs
  3. DataGridDoubleClickBehavior.cs
  4. Model
  5. ViewModel
  6. xaml 사용법
  7. ✅ Behavior를 사용한 DataGrid 더블 클릭 이벤트 - 끝
  8. 관련 포스팅
'WPF' 카테고리의 다른 글
  • StackPanel에 ItemsSource로 바인딩하기
  • PasswordBox: Password 속성에 Binding 하는 두 번째 방법 (Attached Property)
  • WPF: BooleanToSolidColorBrushConverter
  • WPF: 다른 Control에 가려진 Control을 클릭하는 방법
YUNYUN3915
YUNYUN3915

공지사항

  • 블로그 이전 취소

인기 글

태그

  • WindowsFormsHostingWpfControl
  • 문자열 관리
  • command
  • CS8602
  • WPF style
  • OnPropertyChanged
  • RelayCommand
  • TreeViewItem
  • itemssource
  • 어트리뷰트
  • DataGrid
  • TreeView
  • 메세지팝업
  • WPF 흰색바
  • ItemsControl
  • wpf 전역 스타일
  • PasswordBox DataBinding
  • Expanding Event
  • IDialogService
  • 윈도우탐색기
  • C#
  • IValueConverter
  • ICloneable
  • wpf
  • GIT
  • ElementHost
  • Git취소
  • DialogService
  • PasswordBox MVVM
  • wpf 폰트
hELLO · Designed By 정상우.v4.2.0
YUNYUN3915
DataGrid: 더블 클릭으로 DataRow를 Select 하는 방법
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.