C# 数据网格绑定-don';不显示列表中的空条目
我有以下XAMLC# 数据网格绑定-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
<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()
。。。我亲眼目睹了这一切。