如何将数据网格绑定到数据源的二级属性

本文关键字:属性 二级 数据源 数据 数据网 绑定 网格 | 更新日期: 2023-09-27 18:33:33

假设您为属性由基元类型组成的类Person和属性均为基元类型的类Address编写代码。将多个Person对象放在一个ObservableCollection中,并希望将其绑定到 DataGrid。具有基元类型的属性将正常显示,但属性Address,即由基元类型组成的类,将只显示"(集合)"。

我在谷歌搜索时找到了这个问题的解决方案,但对于一些功能来说似乎有很多工作要做。我找到的解决方案是针对DataGridView的,日期为 2007 年。现在有没有更简单的方法可以使用 WPF 和 DataGrid,或者它同样困难?

示例代码:

class Person
{
    private string id;
    private string name;
    private Address homeAddr;
    public string ID
    {
            get { return id;}
            set { id = value;}
    }
    public string Name
    {
            get { return name;}
            set { name = value;}
    }
    public Address HomeAddr
    {
            get { return homeAddr;}
            set { homeAddr = value;}
    }
}
class Address
{
    private string cityname;
    private string postcode;
    public string CityName
    {
        get { return cityname;}
        set { cityname = value;}
    }
    public string PostCode
    {
        get { return postcode;}
        set { postcode = value;}
    }
}

如何将数据网格绑定到数据源的二级属性

<DataGrid>
  <DataGrid.Columns>
    <DataGridTextColumn Binding="{Binding Id}"/>
    <DataGridTextColumn Binding="{Binding Name}"/>
    <DataGridTextColumn Binding="{Binding HomeAddr.CityName}"/>
    <DataGridTextColumn Binding="{Binding HomeAddr.PostCode}"/>
  </DataGrid.Columns>
</DataGrid>
无法将

地址直接添加到 DataGrid 列的原因是,该列需要基元类型,并且您发送了"地址"类型对象。若要解决此问题,必须创建一个转换器,将 Address 对象转换为基元类型,如字符串。

首先在资源字典中添加转换器

<src:AddressToStringConverter x:Key="AddressToStringConverter" />

然后在网格中使用它

<DataGrid>
  <DataGrid.Columns>
    <DataGridTextColumn Binding="{Binding Id }"/>
    <DataGridTextColumn Binding="{Binding Name}"/>
    <DataGridTextColumn Binding="{Binding HomeAddr, Converter={StaticResource AddressToStringConverter}}"/>
  </DataGrid.Columns>
</DataGrid>

在这里您可以找到有关转换器的更多信息:http://wpftutorial.net/ValueConverters.html