0

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

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

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

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

1.动态列创建,但这并不好,因为我对每一行都有不同的架构

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

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

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

提前致谢

4

2 回答 2

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>
于 2013-04-18T14:06:42.933 回答
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);
于 2013-04-18T14:33:16.740 回答