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

时间:2014-12-17 01:05:33

标签: c# wpf xaml mvvm datagrid

背景

如果我们有一个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在列级别需要这个额外的绑定代码。为什么呢?

1 个答案:

答案 0 :(得分:2)

DataGrid.AutoGenerateColumns属性负责自动在Datagrid中为您生成列。

默认情况下,DataGrid的AutoGenerateColumns设置为true。如果您使用过ObservableCollection<Person>,则会查看Person类的属性列表并生成项属性 - ReadOnlyCollection<ItemPropertyInfo> itemProperties。基于此列表,它将在内部绑定标头和单元格。

但在第二种情况下,您使用的ObservableCollection<decimal>不是对象类型而是值类型。它没有任何属性定义其定义,因此它不会产生任何itemProperties列表。因此,您不会在内部完成任何绑定,并且datagrid将只是空行。