【问题标题】:Expandable columns in a datagrid数据网格中的可扩展列
【发布时间】:2012-04-19 04:40:57
【问题描述】:

我正在开发 WPF 应用程序来呈现和纠正大量数据。 我即将实现一个数据网格,其中包含来自外部服务填充的 3 个不同来源的数据。 首先,我将仅使用来自一个源(主源)的数据填充网格。 但是,有时自动验证器会在一个单元格上触发验证警告或错误,并且要求用户应该能够在选定的一个旁边的列中查看来自其他 2 个源的数据。

类似这样的:

Standard view:

| col1 src1 | col2 src1 | col3 src1 |
|           |           |           | 
|           |faulty     |           |
|           |           |           |

用户希望在“col2 src1”列旁边显示来自源 2 和 3 的数据,如下所示:

| col1 src1 | col2 src1 | col2 src2 | col2 src3 | col3 src1 |
|           |           |           |           |           |
|           |corrected  |           |           |           |
|           |           |           |           |           |

然后能够使用来自其他 2 个来源的数据更正格式化错误的单元格,然后再次折叠列。

我正在尝试在这个上使用 mvvm 模式,所以到目前为止我已经用 ListCollectionView 填充了 DataGrid。 该列表包含具有如下属性的项目:

MyRowItem {string col1, string col2, string col3}

然后,我将有 2 个额外的集合,其中包含上述类型的项目,但来自其他 2 个来源。

我不知道如何实现此功能,并且可以在逻辑上使用一些帮助。 我应该采取什么方法?

【问题讨论】:

    标签: wpf c#-4.0 datagrid listcollectionview


    【解决方案1】:

    DataGrid 的列有一个属性 Visibility - 通过绑定切换它。 使用您的 ViewModel 来确定您何时进入准备好显示列的状态 无论您的 ItemsSource 用于网格; 让我们假设 ObservableCollection, 让 MyRowItem 不仅仅是字符串

    public class MyRowItem
    {
         string ColumnDisplayValue {get;set;}
         bool IsVisible {get;set;}
    }
    
    
    <DataGrid ItemsSource="{Binding ViewModel.MyRowItems}">
        <DataGrid.Columns>
            <DataGridTextColumn
                    Binding="{Binding ColumnDisplayValue }" 
                    Visibility="{Binding IsVisible, Converter={StaticResource BoolToVisibility}}">
    

    或将它们放在一列中:

    <DataGridTemplateColumn>
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition/>
                                <ColumnDefinition/>
                                <ColumnDefinition/>
                            </Grid.ColumnDefinitions>
                            <TextBlock                 Width="33*" Text="{Binding crs1}" Visibility="{Binding IsSrc1Visible, Converter={StaticResource BoolToVisibility}}" />
                            <TextBlock Grid.Column="1" Width="33*" Text="{Binding crs2}" Visibility="{Binding IsSrc2Visible, Converter={StaticResource BoolToVisibility}}" />
                            <TextBlock Grid.Column="2" Width="33*" Text="{Binding crs3}" Visibility="{Binding IsSrc3Visible, Converter={StaticResource BoolToVisibility}}" />
                        </Grid>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
    

    【讨论】:

    • 首先感谢您的回答。我想我明白了你的解决方案背后的基本想法,但我一直无法弄清楚。有什么办法可以详细说明一下吗?此外,我似乎无法使用
      我会在今天休息的时候添加一些编译和运行的东西。
    • 现在,我对答案进行了更改,绑定不起作用的原因是因为我使用了模板 col,而不是 DataGRidTextColumn
    • 不,我必须考虑一下,我不知道您是否想让列可见只是为了公开不同的来源。通过使整列可见,您将暴露可能不需要第二个源的其余行。为什么不在行内有一个堆栈面板,并在每行打开它(通过切换它的可见性或其他......)这样只有选定的行在需要时才具有更多信息......
    • 好的,图我有 MyRowItem{prop FirstNameSource1, prop FirstNameSource2, prop FirstNameSource3, prop LastNameSource1, prop LastNameSource2, prop LastNameSource3} 我只想先显示来自 Source1 的数据,然后可以展开用户命令中 Source2 和 Source3 的列。我正在考虑您使用堆栈面板完成这项工作的想法。只需要看看它是否符合要求。
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签