为什么我需要此数据网格的额外绑定语法
本文关键字:绑定 语法 网格 数据网 数据 为什么 | 更新日期: 2023-09-27 18:34:22
Background
如果我们有一个 CLR 对象,例如:
class Person
{
public string FirstName {get; set;}
public string LastName {get; set;}
}
我们可以创建一个 ObservableCollection,添加一些样板代码,瞧,我们可以使用 XAML 将其绑定到 DataGrid,如下所示:
<DataGrid ItemsSource="{Binding PropertyOnPersonObject}"'>
数据网格知道获取此对象并自动填充每一列。
发生了什么事
在视图模型中,我想创建一个带有ObservableCollection<decimal>
的单列 DataGrid。所以我做了一个公共财产,并像上面一样绑定。不断发生的事情是我会得到正确的行数但没有数据。仅仅使用ItemsSource是不够的。
我终于发现我需要这个:
<DataGrid ItemsSource="{Binding PropertyOnSomething}">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding}"/>
</DataGrid.Columns>
</DataGrid>
DataGrid 在列级别需要此额外的绑定代码。为什么?
DataGrid.AutoGenerateColumns
属性负责在数据网格中自动生成列。
默认情况下,DataGrid 将 AutoGenerateColumns 设置为 true。如果您使用了ObservableCollection<Person>
它将遍历Person
类的属性列表并生成 items 属性 - ReadOnlyCollection<ItemPropertyInfo> itemProperties
。根据此列表,它将在内部绑定标题和单元格。
但在第二种情况下,您使用了ObservableCollection<decimal>
它不是对象类型,而是值类型。它没有任何属性定义其定义,因此它不会产生任何itemProperties
列表。因此,您不会在内部完成任何绑定,数据网格将只是空行。