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

时间:2011-10-05 19:22:33

标签: c# wpf xaml data-binding datagrid

我有以下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; }
}

列表Technologies是datagrid的数据源。此解决方案在datagrid中有所有列表项。

我想只显示Number不为空的项目。实现它的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

您可以在DataTrigger

上使用DataGridRow
<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>

或者,您可以将Visibility的{​​{1}}绑定到DataGridRow并使用转换器,Number返回Visibility.Collapsednull

答案 1 :(得分:2)

当您将集合设置为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,以便您自动过滤。另外,请确保TechnologyINotifyPropertyChanged已实施。