背景
如果我们有一个CLR对象,例如:
class Person
{
public string FirstName {get; set;}
public string LastName {get; set;}
}
我们可以创建一个ObservableCollection,添加一个简单的样板代码,我们可以将它与XAML绑定到DataGrid,如:
<DataGrid ItemsSource="{Binding PropertyOnPersonObject}"\>
DataGrid知道获取此对象并自动填充每列。
发生了什么
在viewmodel中,我想创建一个带有ObservableCollection<decimal>
的单列DataGrid。所以我创建了一个公共财产,就像上面一样。持续发生的事情是我得到正确的行数但没有数据。仅使用ItemsSource是不够的。
我终于想通了我需要这个:
<DataGrid ItemsSource="{Binding PropertyOnSomething}">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding}"/>
</DataGrid.Columns>
</DataGrid>
DataGrid在列级别需要这个额外的绑定代码。为什么呢?
答案 0 :(得分:2)
DataGrid.AutoGenerateColumns
属性负责自动在Datagrid中为您生成列。
默认情况下,DataGrid的AutoGenerateColumns设置为true。如果您使用过ObservableCollection<Person>
,则会查看Person
类的属性列表并生成项属性 - ReadOnlyCollection<ItemPropertyInfo> itemProperties
。基于此列表,它将在内部绑定标头和单元格。
但在第二种情况下,您使用的ObservableCollection<decimal>
不是对象类型而是值类型。它没有任何属性定义其定义,因此它不会产生任何itemProperties
列表。因此,您不会在内部完成任何绑定,并且datagrid将只是空行。