Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 数据网格绑定-don';不显示列表中的空条目_C#_Wpf_Xaml_Data Binding_Datagrid - Fatal编程技术网

C# 数据网格绑定-don';不显示列表中的空条目

C# 数据网格绑定-don';不显示列表中的空条目,c#,wpf,xaml,data-binding,datagrid,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.Co

我有以下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; }
}
公共类数据
{
公共列表技术{get;set;}
}
公共类技术
{
公共字符串名称{get;set;}
公共整数{get;set;}
}
列表
技术
是datagrid的数据源。此解决方案在datagrid中包含所有列表项


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

您可以在
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>


或者,您可以将
DataGridRow
Visibility
绑定到
Number
,并使用一个返回
可见性的转换器。对于
null
Visibility,可折叠的
。可见的
否则当您将集合设置为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?
它怎么可能为空


另外,我建议您使用
observateCollection
,以便在
Number
发生变化时进行自动筛选。还要确保
Technology
已经实现了
INotifyPropertyChanged

关于
Number
不可为空的好观点,我想这是一个输入错误:)I项0,而不是null。感谢您对“ObservableCollection”的建议,我想我的申请中不需要这个。“数字”不变。@Melak,这可能会导致交替行样式出现问题,因为假设交替行具有桃色背景颜色,则如果第1行正常,第2行为空,第3行正常,则您将看到第1行和第3行与桃色背景连接。@AngelWPF:是的,如果使用交替行颜色,这将是一个问题。在
CollectionView
上使用过滤器的问题在于,当
Number
更改时,过滤器不会自动更新。因此,归根结底,这是如何使用的。如果列表是ObservableCollection,那么它也会根据属性更改进行过滤。@AngelWPF:使用
ObservableCollection
作为
SourceCollection
进行
ListCollectionView
不会在属性更改后触发
过滤器
。还是我误解了你的评论?等等,好像有些错误。。。如果项是
INotifyPropertyChanged
且集合是
可观察的
,则属性会“固有地”级联到CollectionView,以自动执行排序、分组和筛选,而无需
CollectionView.Refresh()
。。。我亲眼目睹了这一切。