我需要在WPF应用程序中显示一个没有固定表格结构的“数据矩阵”,即
数据第1行:aaa bb ccc
数据行2:222 $$ ddddd eeee
......
所有数据都在数组列表中。
我需要显示此数据并使用户能够滚动它。
奇怪的数据结构来自文本平面文件,我无法改变这一点。
我已经阅读了很多,并尝试了列表视图和网格视图,但到目前为止我只能得到:
1。 dymanic列创建,但这并不好,因为每行都有不同的架构
2. 将每行数据呈现为(分隔/格式化)文本。但这并不好,因为所有行数据都在一个单元格中结束(显然)。
3。(还没有这样做,希望避免)有很多带触发器的数据模板,每个模板都有不同的列数 - 比如5到40 - 表示绝大多数行类型。
我的问题是:如何将此数据绑定到类似列表/网格的可滚动视图?
提前致谢
答案 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);