显示每行中具有不同列数的数据矩阵

时间:2013-04-18 13:53:14

标签: wpf

我需要在WPF应用程序中显示一个没有固定表格结构的“数据矩阵”,即

数据第1行:aaa bb ccc
数据行2:222 $$ ddddd eeee
...... 所有数据都在数组列表中。

我需要显示此数据并使用户能够滚动它。
奇怪的数据结构来自文本平面文件,我无法改变这一点。

我已经阅读了很多,并尝试了列表视图和网格视图,但到目前为止我只能得到:

1。 dymanic列创建,但这并不好,因为每行都有不同的架构

2. 将每行数据呈现为(分隔/格式化)文本。但这并不好,因为所有行数据都在一个单元格中结束(显然)。

3。还没有这样做,希望避免)有很多带触发器的数据模板,每个模板都有不同的列数 - 比如5到40 - 表示绝大多数行类型。

我的问题是:如何将此数据绑定到类似列表/网格的可滚动视图?

提前致谢

2 个答案:

答案 0 :(得分:2)

如果您不需要能够选择项目,则可以使用嵌套的ItemsControls

只需将第一个ItemsControl绑定到您的数组集合,然后将ItemTemplate设置为绑定到值数组的另一个ItemsControl

这样的事情:

<ScrollViewer Height="300" Width="400">
    <ItemsControl ItemsSource="{Binding ListOfArrays}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <ItemsControl ItemsSource="{Binding }">
                    <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate>
                            <StackPanel Orientation="Horizontal" />
                        </ItemsPanelTemplate>
                    </ItemsControl.ItemsPanel>

                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding }"  Width="50" />
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</ScrollViewer>

答案 1 :(得分:1)

找到最大列数的一遍。
构建一个具有属性cols string [maxColCount]的简单Row类 在代码绑定中为GridView构建maxColCount列,并将源绑定到cols [x]。

编译器需要一个属性,但您可以将该列绑定到集合名称索引
构建和绑定GridViewColumn的语法

            gvc = new GridViewColumn();
            gvch = new GridViewColumnHeader();
            gvch.Content = fd.FieldDef.DispName;
            gvch.HorizontalContentAlignment = System.Windows.HorizontalAlignment.Stretch;
            if (fd.FieldDef.Sort)
            {
                gvch.Click += new RoutedEventHandler(SortClick);
                gvch.Tag = fd.FieldDef.Name;
            }

            // if (fd.ID == 0 || fd.ID == 1) gvc.Width = 60; sID, sParID
            if (!fd.AppliedDispGrid) gvc.Width = 0;
            gvc.Header = gvch;

            gvBinding = new Binding();
            gvBinding.Mode = BindingMode.OneWay;
            gvBinding.Path = new PropertyPath("DocFields[" + sDocBaseResultDocsFieldsIndex.ToString() + "].DispValueShort");

            template = new DataTemplate();
            textblock = new FrameworkElementFactory(typeof(TextBlock));
            textblock.SetValue(TextBlock.TextProperty, gvBinding);
            textblock.SetValue(TextBlock.TextTrimmingProperty, TextTrimming.WordEllipsis);

            // <Setter Property="TextTrimming" Value="WordEllipsis" />

            template.VisualTree = new FrameworkElementFactory(typeof(Grid));
            template.VisualTree.AppendChild(textblock);

            gvc.CellTemplate = template;

            gvSearchResults.Columns.Add(gvc);