跳转至

WPF_ DataGrid隐藏列

3 个思路:

  1. 绑定列的宽度,设置宽度为 0,即为隐藏
  2. 绑定 Visibility 属性,这种方法存在不少坑,如果只是控制列的可见性,会留下一片空白区域,不会自动收缩,设置了Collaspe也不行
  3. 后台代码使用 GridColumnStylesCollection 和 DataGridColumnStyle 对象(它们是 DataGridTableStyle 类的成员)的属性和方法以编程方式删除或隐藏 Windows 窗体 DataGrid 控件中的列。

思路2解析

正常写如下,但无论加载还是运行,都无法走到转换器,一般绑定 Path 没有问题。

Visibility="{Binding ElementName=sample,Path=IsChecked,Converter={StaticResource BoolConverter}}"

因为 DataGrid 列是抽象对象,Column 在视觉树上找不到,因此绑定中使用到的 ElementNameRelativeSource 属性都无法直接使用,而改用 x:Reference就可以解决。

前端写法 1:

 <FrameworkElement x:Name="dummyElement" Visibility="Collapsed"/>
    <DataGrid>
        <DataGrid.Columns>
            <DataGridTextColumn Header="Test"
                                Binding="{Binding Name}"
                                Visibility="{Binding DataContext.Visible,
                                          Source={x:Reference dummyElement}}"/>
        </DataGrid.Columns>
    </DataGrid>

前端写法 2:

<Window.Resources>
    <ResourceDictionary>
        <FrameworkElement x:Key="ProxyElement" DataContext="{Binding}" />
    </ResourceDictionary>
</Window.Resources>

<!-- Necessary for binding to resolve: adds reference to ProxyElement to tree.-->
<ContentControl Content="{StaticResource ProxyElement}" Visibility="Collapsed" />
<mch:MCHDataGrid Height="350"
                  AutoGenerateColumns="False"
                  FlowDirection="LeftToRight"
                  ItemsSource="{Binding PayStructures}"
                  SelectedItem="{Binding SelectedItem}">
    <DataGrid.Columns>
         <DataGridTemplateColumn Width="70"
                                 Header="name"
                                 IsReadOnly="True"
                                 Visibility="{Binding DataContext.Visible,
                                 Source={StaticResource ProxyElement}}">
             <DataGridTemplateColumn.CellTemplate>
                 <DataTemplate>
                     <TextBlock Text="{Binding FieldName}" />
                 </DataTemplate>
             </DataGridTemplateColumn.CellTemplate>
         </DataGridTemplateColumn>
     </DataGrid.Columns>
</mch:MCHDataGrid>

通知属性:

private System.Windows.Visibility m_visible;
public System.Windows.Visibility Visible
{
    get => m_visible;
    set => SetProperty(ref m_visible, value);
}

评论