DataGrid绑定-不要显示列表中的空条目

本文关键字:列表 显示 绑定 DataGrid | 更新日期: 2023-09-27 18:10:27

我有以下XAML

<DataGrid Name="grid">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Technology" Binding="{Binding Name}" />
        <DataGridTextColumn Header="Version" Binding="{Binding Number}" />
    </DataGrid.Columns>
</DataGrid>

和以下类

public class Data
{
    public List<Technology> Technologies { get; set; }
}
public class Technology
{
    public string Name { get; set;}
    public int Number { get; set; }
}

List Technologies是数据网格的数据源。该解决方案在数据网格中包含所有列表项。

我想只显示Number不为空的项目。实现这一目标的最佳方式是什么?

DataGrid绑定-不要显示列表中的空条目

当你将集合设置为ItemsSource时,通过ListCollectionView

      grid.ItemsSource
            = new ListCollectionView(Technologies);
      ((ListCollectionView)grid.ItemsSource).Filter += IsNotNull;

有这样一个谓词....

      private bool IsNotNull(object obj )
      {
         return ((Technology)obj).Number != null;
      }

虽然一个奇怪的问题,你的Number属性是int不是int?它怎么可能是空的?

我还建议您使用ObservableCollection<Technology>,以便在Number更改时自动过滤。同时确保Technology已经实现了INotifyPropertyChanged

可以在DataGridRow上使用DataTrigger

<DataGrid Name="grid">
    <DataGrid.RowStyle>
        <Style TargetType="DataGridRow">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Number}" Value="{x:Null}">
                    <Setter Property="Visibility" Value="Collapsed"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataGrid.RowStyle>
    <DataGrid.Columns>
        <DataGridTextColumn Header="Technology" Binding="{Binding Name}" />
        <DataGridTextColumn Header="Version" Binding="{Binding Number}" />
    </DataGrid.Columns>
</DataGrid>

或者您可以将DataGridRowVisibility绑定到Number,并使用Converter为nullVisibility.Visible返回Visibility.Collapsed,否则