WPF - 使用动态列/行显示结果网格

时间:2011-08-05 16:33:02

标签: wpf

我正在查询在线服务(Google数据Feed),该服务可以返回每个请求都会包含不同数量的列和行的结果。

到目前为止,我无法让数据网格或网格为我工作。理想情况下,我想要像excel一样工作的东西 - 你可以只添加行并设置单个单元格的值

1 个答案:

答案 0 :(得分:1)

您可以创建一个类,例如myGridCol表示列并创建列的集合。阅读Google数据Feed并创建列。然后你需要单独添加列,例如myGridCol [0],myGridCol [1] ..作为DataGridColumns的代码在后面。您无法直接绑定到列集合。

您只需绑定到具有列集合的行的集合 在我的情况下,我使用的是GridView,但我使用了与DataGrid相同的方法 在我的例子中,sDocs是一个ObservableCollection sDoc有公共列表DocFields Fields集合在每个sDoc中完全相同,因为我确定它是。 如果每个sDoc中的Fields集合不相同,那么它就不喜欢了 sDocs是GridView的ItemsSource 然后在我后面的代码中添加列。正如我之前所说,你不能直接绑定到列集合。请注意,您甚至可以将路径绑定到属性(.e.g.DispValueShort)。我的DocField类有其他属性和方法。 DocField实际上是一个带有抽象属性DispValueShort的抽象类。然后我有实现DocField的字符串,日期和枚举类,因为字符串的编辑与编辑日期不同。我甚至有单值和多值的类。这是一个稳定的生产应用程序。

结合

    <ListView Grid.Row="1" Grid.Column="0" x:Name="lvSrchResulsGrid" 
            ItemsSource="{Binding Path=MyGabeLib.Search.SDocs}"

背后的代码

    sDocBaseResultDocsFieldsIndex = 0;      
    foreach (GabeLib.DocField docField in sDocBaseResultDocsFields)
    {
        // Debug.WriteLine("  sDocBaseResultDocsFields DispName = " + docField.FieldDef.DispName);
        if (fd.FieldDef == docField.FieldDefApplied.FieldDef)
        {
             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.AppliedDispGrid) gvc.Width = 0;  // how to hide
             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);
             break;
         }
         sDocBaseResultDocsFieldsIndex++;
     }