我正在查询在线服务(Google数据Feed),该服务可以返回每个请求都会包含不同数量的列和行的结果。
到目前为止,我无法让数据网格或网格为我工作。理想情况下,我想要像excel一样工作的东西 - 你可以只添加行并设置单个单元格的值
答案 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++;
}