我想将一些对象绑定到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
但似乎没有任何效果。
我事前并不知道将会有多少列,但每行的数字和类型总是相同。有什么建议吗?
答案 0 :(得分:2)
如果您考虑ItemsSource
,ObservableCollection
ObservableCollection
,那么您会发现网格中的每一行都只是一个ObservableCollection
对象。 DataGrid
不够智能,无法在每个项目中查看集合内部(并且它没有意义 - 每个集合中可能有不同数量的项目,因此它不能自动生成将项目映射到列)。它只会查看行的DataContext
对象,并将公共属性用作列(在这种情况下,ObservableCollection
的唯一属性是Count
}
IBindingList
接口,它允许更复杂的绑定方案(我相信这是DataTable
可以将列公开为绑定目的的属性。看一看IBindingList
有关ObservableCollection
及其可能有用的信息的this answer。您可以创建一个派生自IBindingList
并实现DataTemplate
的自定义类,以将DataPoints作为属性公开
原:
由于您不知道将有多少列,因此您无法通过XAML以声明方式对其进行数据绑定。我相信您需要在代码中手动创建列并为每列设置Binding。
此外,您需要{{1}}作为DataPoint类型,以便它知道如何直观地显示类型。