WPF_ DataGrid隐藏列
2025年1月5日大约 1 分钟
3 个思路:
- 绑定列的宽度,设置宽度为 0,即为隐藏
- 绑定 Visibility 属性,这种方法存在不少坑,如果只是控制列的可见性,会留下一片空白区域,不会自动收缩,设置了Collaspe也不行
- 后台代码使用 GridColumnStylesCollection 和 DataGridColumnStyle 对象(它们是 DataGridTableStyle 类的成员)的属性和方法以编程方式删除或隐藏 Windows 窗体 DataGrid 控件中的列。
思路2解析
正常写如下,但无论加载还是运行,都无法走到转换器,一般绑定 Path 没有问题。
Visibility="{Binding ElementName=sample,Path=IsChecked,Converter={StaticResource BoolConverter}}"
因为 DataGrid 列是抽象对象,Column 在视觉树上找不到,因此绑定中使用到的 ElementName
、 RelativeSource
属性都无法直接使用,而改用 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);
}