如何将DataGrid绑定到数据源的第二级属性?

时间:2013-09-30 22:16:38

标签: c# wpf data-binding properties

假设您为类Person编写代码,其属性由基本类型组成,类Address的属性都是基本类型。您在Person中放置了多个ObservableCollection对象,并且希望将其绑定到DataGrid。具有基本类型的属性将正常显示,但属性Address(即由基本类型组成的类)将仅显示“(Collection)”。

我在谷歌搜索时发现了solution这个问题,但是对于一些小功能来说似乎有很多工作要做。我找到的解决方案是针对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;}
    }
}

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

您无法直接将地址添加到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