为什么我需要此数据网格的额外绑定语法

本文关键字:绑定 语法 网格 数据网 数据 为什么 | 更新日期: 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列表。因此,您不会在内部完成任何绑定,数据网格将只是空行。