MVVM - 使用autogeneratecolumns = True基于列名隐藏Datagrid列

时间:2018-02-12 14:15:08

标签: c# wpf mvvm datagrid

我有一个DataGrid绑定到Datatable,我希望使用DataTable唯一标识ID中的行,但我不是&# 39; t希望它显示在DataGrid

我通过搜索和排除到目前为止所得到的内容:

  1. 数据列未预定义,因此,我必须使用AutoGenerateColumns=True,因此,我无法手动定义列并将Visibility属性设置为False。< / LI>
  2. 我无法使用ListObservableCollection来定义私人ID成员,因为数据是动态的。
  3. 我正在关注MVVM因此,我无法直接使用AutoGeneratingColumns事件处理程序,并且无法将View公开给ViewModel。< / LI>

    我最接近答案的是使用DataTrigger使用VisibilityFalse设置为CellStyle,但它只隐藏了单元格,而不是整个列,以及我也为DataGridColumnHeader尝试了它并且它没有工作:

    代码:

            <Style x:Key="ColumnStyle" TargetType="DataGridColumnHeader">
            <Style.Triggers>
                <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=Value}" Value="id">
                    <Setter Property="Visibility" Value="Hidden"></Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    

    如何在保持以前的条件的同时做到这一点? 提前致谢

    编辑:

    我使用DataGridColumnHeader修复了Path=Column.Header的代码,这对我来说没有意义,但它无关紧要;不过,那里还有空柱,不知道如何移除它。

2 个答案:

答案 0 :(得分:0)

听起来您想跟踪所选项目。如果要跟踪“选定的元素”,则必须使用CollectionView。

WPF控件不直接绑定到集合。它们绑定到CollectionView。如果你不给他们一个,他们将从你交给他们的任何集合中创造一个。如果您想要排序,过滤,订购和选择跟踪,CollectionView是您正在寻找的机器人: https://msdn.microsoft.com/en-us/library/system.windows.data.collectionview.aspx

控制它的创建并将其暴露(而不是原始集合)。

答案 1 :(得分:0)

我通过应用这种风格找到了解决方案:

<Style x:Key="ColumnStyle" TargetType="DataGridColumnHeader">
    <Style.Triggers>
        <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=Value}" Value="id">
            <Setter Property="Visibility" Value="Hidden"></Setter>
        </DataTrigger>
    </Style.Triggers>
</Style>

DataGridCellDataGridColumnHeader以及分配表格末尾的列,这会从表格中间删除空列。

相关问题