WPF로 DataGrid 컴포넌트 이용 시 발생한 문제 해결 과정을 정리하였습니다.
TreeView를 이용하여 동적으로 TreeViewItem을 생성하고 구현하였습니다. 하지만 조금 더 깔끔한 화면 구성을 위해 DataGrid로 변경하기로 결정하였습니다.
참조한 소스코드 : WPF TreeGrid using a DataGrid


동적 템플릿 구성에 대한 간단한 테스트 후 기존 소스코드에 다 적용한 상태였기 때문에 마지막 단계에서 방향을 돌려야 한다는 것은 아주 큰 리스크였습니다.
구글링 중 DataGrid 스크롤 문제를 언급하신 TISTORY 블로그를 드디어 찾아내게 됩니다.
무려 2010년에 쓰여진 실버라이트 글이었는데 저에게 큰 도움이 되었습니다.👍
<!-- MainWindow.xaml 파일 -->
<ScrollViewer VerticalScrollBarVisibility="Auto">
<DataGrid AutoGenerateColumns="False" Name="grid" CanUserAddRows="False"
VerticalScrollBarVisibility="Hidden">
...
</DataGrid>
</ScrollViewer>
아래 위로 스크롤을 움직였을 때 체크박스 해제가 되지 않습니다.

체크박스를 선택 시 연결된 Binding 변수의 set 함수가 호출됩니다.

하지만 완벽하게 처리되지 않고 여전히 이벤트가 호출되지 않는 현상이 발생했습니다.😢
기존에는 DataGrid에서 생긴 스크롤을 사용하여 마우스 휠을 어느 영역에서 하든 위아래 이동이 가능했다면 ScrollViewer를 사용하면 DataGrid 영역 내에서 스크롤 이동이 마우스 휠로 동작하지 않게 됩니다.
<!-- MainWindow.xaml 파일 -->
<ScrollViewer VerticalScrollBarVisibility="Auto" Name="scrollViewer">
<DataGrid AutoGenerateColumns="False" Name="grid" CanUserAddRows="False"
VerticalScrollBarVisibility="Hidden"
PreviewMouseWheel="DataGrid_PreviewMouseWheel">
...
</DataGrid>
</ScrollViewer>
// MainWindow.xaml.cs
private void DataGrid_PreviewMouseWheel(object sender, MouseWheelEventArgs e){
scrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset - e.Delta / 3);
}
간소화한 소스코드로 테스트 해 본 컨트롤은 TextBox와 CheckBox입니다. 해결방법은 Binding할 때 UpdateSourceTrigger를 추가해 주면 됩니다.
<DataGrid.Columns>
<DataGridTemplateColumn Header="Name">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
...
<TextBox Text="{Binding Name, Mode=TwoWay, UpdateSourceTrigger=LostFocus}"/>
<CheckBox IsChecked="{Binding IsNameChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
...
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGrid.Columns>
DataGrid를 ScrollViewer로 감싸줬으니 어쩔 수 없는 부분으로 보이긴 하지만 구현하는 입장에서는 아쉬운 부분입니다.


[참조사이트]