【问题标题】:MVVM - Hide Datagrid column based on column name with autogeneratecolumns = TrueMVVM - 根据列名隐藏 Datagrid 列,autogeneratecolumns = True
【发布时间】:2018-02-12 14:15:07
【问题描述】:

我有一个绑定到DatatableDataGrid,我想使用ID 唯一标识DataTable 中的行,但我不希望它显示在DataGrid

到目前为止我通过搜索和排除达到了什么:

  1. 数据列未预定义,所以我必须使用AutoGenerateColumns=True,因此我无法手动定义列并将Visibility 属性设置为False
  2. 我不能使用ListObservableCollection 来定义私有ID 成员,因为数据是动态的。
  3. 我正在关注MVVM,所以我不能直接使用AutoGeneratingColumns 事件处理程序,也不能将View 暴露给ViewModel

我最接近答案的是使用DataTriggerVisibility 设置为False 使用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>

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

编辑:

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

【问题讨论】:

  • 在我的第一个猜测是错误的之后,有几个问题:为什么以及如何不知道该 DataGrid 中将公开什么?数据从何而来?它代表什么?您使用什么类来存储它(ExpandoObject、Dictionary、Dynamic 等)?
  • 我的意思是我应该使用 DataGrid 对象,而不是其中的数据。对不起,如果我表达错了......我正在使用DataTable
  • 不,我的意思是这部分“数据列未预定义”。您不知道每个 Collection Item 将具有哪些属性,这真是令人困惑。为什么不只是将它们映射到一组适当的 ViewModel 类和目标模板?
  • 数据列是在每次使用时在 ViewModel 中定义的......但在设计时我不知道这些列是什么或有多少列
  • 是的。当你把它写进问题时,我明白了。 为什么会这样?

标签: c# wpf mvvm datagrid


【解决方案1】:

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

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

只需控制它的创建并公开它(而不是原始集合)。

【讨论】:

  • 第一;集合视图操作的是行,而不是列,如果您知道使用collectionView 的某种方式,请明确说明。此外,我不需要跟踪所选项目,因为我制作了复选框,而这正是我需要从用户那里获得的。
【解决方案2】:

我通过应用这种样式找到了解决方案:

<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分配表格末尾的列这从表格中间删除了空列。

【讨论】:

    猜你喜欢
    • 2011-11-25
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 2011-10-15
    • 1970-01-01
    相关资源
    最近更新 更多