【问题标题】:DataGrid Binding - don't show null entries from listDataGrid 绑定 - 不显示列表中的空条目
【发布时间】:2011-10-05 19:22:32
【问题描述】:

我有以下 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 不为空的项目。实现它的最佳方法是什么?

【问题讨论】:

    标签: c# wpf xaml data-binding datagrid


    【解决方案1】:

    当您将集合设置为 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? 怎么会是 Null?

    另外我建议您使用ObservableCollection&lt;Technology&gt;,以便在Number 更改时自动过滤。还要确保Technology 已实现INotifyPropertyChanged

    【讨论】:

    • 关于Number 不能为空的好点,我想这是一个错字
    • 打错了 :) 我输入了 0,而不是 null。感谢您对“ObservableCollection”的建议,我想我的申请中不需要这个。 “数字”没有任何变化。
    【解决方案2】:

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

    或者,您可以将Visibility 绑定到DataGridRowNumber,并使用一个转换器返回Visibility.CollapsednullVisibility.Visible 否则

    【讨论】:

    • @Melak,这可能会导致交替行样式出现问题,因为假设如果交替行有桃色背景颜色,那么如果第 1 行正常,第 2 行为空,第 3 行正常,那么您将看到第 1 行和 row3 加入桃背景。
    • @AngelWPF:是的,如果使用交替行颜色,这将是一个问题。在CollectionView 上使用过滤器的问题在于它不会在Number 更改时自动更新。所以这一切都归结为如何使用它
    • 如果 List 是 ObservableCollection 那么它也会过滤属性更改。
    • @AngelWPF:一旦属性更改,将ObservableCollection 用作SourceCollectionListCollectionView 不会触发Filter。还是我误解了你的评论?
    • 稍等似乎有一些错误...如果项目是INotifyPropertyChanged 并且集合是Observable 然后属性更改“固有地”级联到CollectionView 以执行排序、分组并在没有CollectionView.Refresh() 的情况下自动过滤...我已经看到这种情况发生了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-09
    • 2013-03-23
    • 2015-05-06
    • 1970-01-01
    • 2015-07-27
    • 1970-01-01
    相关资源
    最近更新 更多