列未完全折叠

时间:2019-01-25 12:04:26

标签: c# wpf wpfdatagrid

我正在尝试使用以下代码根据条件折叠列:

<DataGridTextColumn Header="MyColumn" Binding="{Binding MyProperty}">
    <DataGridTextColumn.HeaderStyle>
        <Style TargetType="{x:Type DataGridColumnHeader}">
            <Setter Property="Width" Value="0cm"/>
            <Setter Property="Visibility" Value="Collapsed"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=ThisView, Path=DataContext.MyboolProperty}" Value="true">
                    <Setter Property="Width" Value="2.5cm"/>
                    <Setter Property="Visibility" Value="Visible"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataGridTextColumn.HeaderStyle>
</DataGridTextColumn>

问题在于该列没有完全折叠,我可以看到该列的一部分。

我也尝试过此代码:

<DataGridTextColumn Header="MyColumn" Binding="{Binding MyProperty}"
        Width="0cm"
        Visibility="Collapsed">
    <DataGridTextColumn.HeaderStyle>
        <Style TargetType="{x:Type DataGridColumnHeader}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=ThisView, Path=DataContext.MyboolProperty}" Value="true">
                    <Setter Property="Width" Value="2.5cm"/>
                    <Setter Property="Visibility" Value="Visible"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataGridTextColumn.HeaderStyle>
</DataGridTextColumn>

在这种情况下,该列将按预期折叠,但是如果该属性(如果触发器为true),则该列仍将折叠。

我也尝试过此选项:

<DataGridTextColumn Header="MyColumn" Binding="{Binding MyProperty}">
    <DataGridTextColumn.HeaderStyle>
        <Style TargetType="{x:Type DataGridColumnHeader}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=ThisView, Path=DataContext.MyboolProperty}" Value="true">
                    <Setter Property="Width" Value="2.5cm"/>
                    <Setter Property="Visibility" Value="Visible"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding ElementName=ThisView, Path=DataContext.MyboolProperty}" Value="false">
                    <Setter Property="Width" Value="0cm"/>
                    <Setter Property="Visibility" Value="Collapsed"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataGridTextColumn.HeaderStyle>
</DataGridTextColumn>

但是行为与第一个选项相同,它不是完全折叠的,但是当触发器的属性为true时它可以工作。

1 个答案:

答案 0 :(得分:1)

您的数据触发器位于列 header 模板内,因此它只能更改列标题的属性(而不是完整列,即单元格)。

Style没有DataGridTextColumn,因此不能使用DataTrigger。但是转换器应该这样做。

但是,另一个问题是列不在可视树中,因此您不能使用ElementNameRelativeSource,它们根本无法工作。但是有一个简单的workaround。然后您的列将如下所示:

<Window.Resources>
    <BooleanToVisibilityConverter x:Key="converter" />
    <local:BindingProxy x:Key="proxy" Data="{Binding}" />
</Window.Resources>

...

<DataGridTextColumn Header="MyColumn"
                    Binding="{Binding MyProperty}"
                    Visibility="{Binding Data.MyboolProperty, Source={StaticResource proxy}, Converter={StaticResource converter}}" />