如何将数据网格绑定到数据源的二级属性
本文关键字:属性 二级 数据源 数据 数据网 绑定 网格 | 更新日期: 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