WPF DataGridTemplateColumn 내부에서 RelativeSource FindAncestor 사용 시 에러

맞는 솔루션인지 모르겠지만 해결이 되어서 업데이트합니다.

<unit:GdtDataGrid Margin="{StaticResource DataGridBorderInterval}"
                  AutoGenerateColumns="False"
                  Background="{StaticResource DataGridAreaBackgroundBrush}"
                  BorderBrush="{StaticResource GdtDataGridBorderBrush}"
                  BorderThickness="1"
                  ColumnHeaderBackgroundBrush="{DynamicResource Theme_PopupDataViewColumnHeaderColorBrush}"
                  CornerRadius="{DynamicResource Theme_AllCornerRadius}"
                  ItemsSource="{Binding Source={StaticResource ItemsSort}}"
                  Visibility="{Binding Items.Count, Converter={cnvt:EmptyCollectionToVisibilityConverter}}">
    ...
    <DataGrid.Columns>
        <DataGridTemplateColumn x:Name="dcChecked"
                                Width="Auto"
                                MinWidth="50">
            <DataGridTemplateColumn.Header>
                <unit:GdtCheckBox IsThreeState="False">
                    <unit:GdtCheckBox.IsChecked>
                        <Binding FallbackValue="False"
                                 Path="DataContext.IsAllChecked"
                                 UpdateSourceTrigger="PropertyChanged">
                            <Binding.RelativeSource>
                                 <RelativeSource AncestorType="{x:Type unit:GdtDataGrid}" Mode="FindAncestor" />
                            </Binding.RelativeSource>
                        </Binding>
                    </unit:GdtCheckBox.IsChecked>
                </unit:GdtCheckBox>
            </DataGridTemplateColumn.Header>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <unit:GdtCheckBox HorizontalAlignment="Center"
                                      VerticalAlignment="Center"
                                      IsChecked="{Binding IsChecked, UpdateSourceTrigger=PropertyChanged}" />
                 </DataTemplate>
             </DataGridTemplateColumn.CellTemplate>
         </DataGridTemplateColumn>
         ...
     </DataGrid.Columns>
 </unit:GdtDataGrid>

형태는 위처럼 생겼었습니다.
이 DataGrid의 Items.Count가 0일 경우 보기 싫어서 아래 컨버터로 Items.Count가 0일 때 Visibility를 바꿨었습니다.

public sealed class EmptyCollectionToVisibilityConverter : ConverterMarkupExtension<EmptyCollectionToVisibilityConverter>
{
    public override object? Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        int count = System.Convert.ToInt32(value);
        Visibility result = count == 0 ? Visibility.Collapsed : Visibility.Visible;

        return result;
    }

    public override object? ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

여기서 아래 부분이 틀렸었네요.

Visibility result = count == 0 ? Visibility.Collapsed : Visibility.Visible;

저걸 Hidden으로 바꿔주면 바인딩에러가 발생하지 않고 정상 동작합니다.

Visibility result = count == 0 ? Visibility.Hidden : Visibility.Visible;

지금 프로젝트 마감 기간이라서 막히는 것을 제껴두고, 다른 일을 하다가… 혹시 몰라 바꿔본게 얻어 걸리게 되었습니다.

테스트 소스를 재현해서 올리려고 했었는데 그 전에 해결되었네요.

답변 주신 분들 모두 감사드립니다.

4개의 좋아요