[C# WPF] Binding RelativeSource

우롱밀크티당도70·2023년 11월 9일
1

WPF

목록 보기
16/22
post-thumbnail
post-custom-banner

1. 배경

DataGrid의 ItemsSource에 컬렉션이 이미 바인딩 되어있을 때, 컬렉션에 포함된 내용 외에 DataGrid의 컬럼에 이벤트를 걸기 위한 Command를 ViewModel에서 찾아 호출하는 방법 찾기


2. 개발환경

  • VisualStudio 2022 / WPF 애플리케이션(.NET Framework 4.7.2)

3. 내용


1. 위와 같은 화면이 있다고 했을 때 관리자Y/N 컬럼에 CheckBox를 보이게 하고싶다. DataGridCheckBoxColumn을 사용하면 되지만 CheckBox가 Checked될 때 이벤트를 걸기 위해 DataGridTemplateColumn으로 CheckBox를 만들어주고 Behavior
를 작성하여 Command를 Binding 하려고 하는데 목록에 만들어준 Command가 보이지 않는다.

이유는 아마 DataGrid의 ItemsSource로 ObservableCollection을 바인딩 해둬서 그런 것 같다. 바인딩한 컬렉션의 내용물 외에는 바인딩 목록에 나오지 않는 것이다.

  1. 좀 길지만 ViewModel에서 작성해둔 Command를 Binding 하는 방법으로 RelativeSource 속성이 있다. RelativeSource는 바인딩 할 객체를 찾아준다. Page4ViewModel에서 찾겠다고 하고 Path를 작성하려고 하면 작성해둔 Command를 목록에서 찾을 수 있다.
			<DataGrid x:Name="ExcelData" ItemsSource="{Binding excelContentsList}" CanUserAddRows="False">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="이름" Binding="{Binding NAME}"/>
                    <DataGridTextColumn Header="품목"  Binding="{Binding MANUFACTURER}"/>
                    <DataGridTextColumn Header="제조사" Binding="{Binding NUMBER}"/>
                    <DataGridTextColumn Header="날짜" Binding="{Binding INCOMING_DATE}"/>
                    <DataGridTemplateColumn Header="관리자Y/N">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <CheckBox>
                                    <i:Interaction.Triggers>
                                        <i:EventTrigger EventName="Checked">
                                            <i:InvokeCommandAction Command="{Binding }"/>
                                        </i:EventTrigger>
                                    </i:Interaction.Triggers>
                                </CheckBox>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                </DataGrid.Columns>
            </DataGrid>

4. 참조

profile
안뇽하세용
post-custom-banner

1개의 댓글

comment-user-thumbnail
2023년 11월 16일

AncestorType을 컨트롤이 아닌 뷰모델로 설정할 수도 있군요. 비주얼 트리에서 뷰모델을 가지고 있을 법한 컨트롤의 DataContext를 참조해서 썼는데 훨씬 직관적인 것 같습니다. 잘 보고 가요!

답글 달기