3

我想将一些对象绑定到datagridin WPF。我非常想避免使用 DataTable!

考虑以下代码:

public ObservableCollection<ObservableCollection<DataPoint>> GridItems { get; set; }

public class DataPoint : INotifyPropertyChanged
{
    public float Value { get; set; }
    public float OriginalValue { get; set; }
    public bool Highlighted { get; set; }
    public SolidColorBrush HighlightColor { get; set; }
    ...
}

XAML:

<toolkit:DataGrid ItemsSource="{Binding GridItems}" />

当我们将 this 绑定到 aDataGrid而不是每个单元格获取一个 DataPoint 对象时,我们会得到一列,Count其属性如图所示。我尝试过 2D 数组、自定义类型(继承自ObservableCollection<DataPoint>),HierarchicalDataTemplate但似乎没有任何效果。

我事先不知道会有多少列,但每一行的数字和类型总是相同的。有什么建议么?

4

1 回答 1

2

如果您考虑您的ItemsSource, an ObservableCollectionof ObservableCollections,那么您将认识到网格中的每一行只是一个ObservableCollection对象。不够聪明,DataGrid无法查看每个项目的集合内部(这没有意义 - 每个集合中可能有不同数量的项目,因此它无法自动将项目映射到列)。它只会查看DataContext作为该行的对象并将公共属性用作列(在这种情况下,唯一ObservableCollection符合条件的属性是Count

编辑:我只记得IBindingList接口,它允许更复杂的绑定场景(我相信这是DataTable可以将列公开为属性以用于绑定目的的方式。查看这个答案以获取有关信息IBindingList以及它如何证明有用的信息。你可能能够创建一个自定义类,该类派生自ObservableCollection并实现IBindingList以将 DataPoints 公开为属性。

原来的:

由于您不知道会有多少列,因此您无法通过 XAML 以声明方式对它们进行数据绑定。我相信您将需要在代码中手动创建列并为每列设置绑定。

此外,您还需要DataTemplateDataPoint 类型,以便它知道如何直观地显示该类型。

于 2012-08-21T02:26:24.357 回答