每个单元格绑定一个数据网格对象

时间:2012-08-20 23:13:44

标签: wpf binding datagrid wpftoolkit

我想将一些对象绑定到datagrid中的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}" />

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

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

1 个答案:

答案 0 :(得分:2)

如果您考虑ItemsSourceObservableCollection ObservableCollection,那么您会发现网格中的每一行都只是一个ObservableCollection对象。 DataGrid不够智能,无法在每个项目中查看集合内部(并且它没有意义 - 每个集合中可能有不同数量的项目,因此它不能自动生成将项目映射到列)。它只会查看行的DataContext对象,并将公共属性用作列(在这种情况下,ObservableCollection的唯一属性是Count}

编辑:我刚刚记得IBindingList接口,它允许更复杂的绑定方案(我相信这是DataTable可以将列公开为绑定目的的属性。看一看IBindingList有关ObservableCollection及其可能有用的信息的this answer。您可以创建一个派生自IBindingList并实现DataTemplate的自定义类,以将DataPoints作为属性公开

原:

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

此外,您需要{{1}}作为DataPoint类型,以便它知道如何直观地显示类型。