如何在XAML中用触发器将TestMessage为null的DataGridTextColumn设为Collapsed
解决方案
要实现当TestMessage为null时隐藏对应单元格(或单元格内的文本控件),你需要使用**CellStyle(控制整个单元格的显示)或ElementStyle**(仅控制单元格内的文本控件),具体选择取决于你的需求:
1. 使用 CellStyle 隐藏整个单元格
如果希望当TestMessage为null时,整个单元格(包括边框、背景等)都隐藏,直接给DataGridTextColumn设置CellStyle,在其中添加DataTrigger判断TestMessage是否为null:
<DataGrid ItemsSource="{Binding Notifications, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" AutoGenerateColumns="False"> <DataGrid.Columns> <DataGridTextColumn Header="Test Message" Binding="{Binding TestMessage}"> <DataGridTextColumn.CellStyle> <Style TargetType="DataGridCell"> <Style.Triggers> <DataTrigger Binding="{Binding TestMessage}" Value="{x:Null}"> <Setter Property="Visibility" Value="Collapsed"/> </DataTrigger> </Style.Triggers> </Style> </DataGridTextColumn.CellStyle> </DataGridTextColumn> </DataGrid.Columns> </DataGrid>
2. 使用 ElementStyle 隐藏单元格内的文本控件
如果只需要隐藏文本内容,保留单元格的边框和布局,就使用ElementStyle,它作用于单元格内的TextBlock:
<DataGrid ItemsSource="{Binding Notifications, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" AutoGenerateColumns="False"> <DataGrid.Columns> <DataGridTextColumn Header="Test Message" Binding="{Binding TestMessage}"> <DataGridTextColumn.ElementStyle> <Style TargetType="TextBlock"> <Style.Triggers> <DataTrigger Binding="{Binding TestMessage}" Value="{x:Null}"> <Setter Property="Visibility" Value="Collapsed"/> </DataTrigger> </Style.Triggers> </Style> </DataGridTextColumn.ElementStyle> </DataGridTextColumn> </DataGrid.Columns> </DataGrid>
关键说明
DataGridTextColumn本身没有Style属性,所以不能直接给列加触发器,必须通过CellStyle(作用于单元格容器)或ElementStyle(作用于单元格内的显示控件)来实现行级的条件判断。- 两种方式都不需要修改ViewModel,完全通过XAML的触发器实现空值判断。
内容的提问来源于stack exchange,提问作者Tommer
相关产品推荐
相关产品推荐

