[英]How to bind DataGrid to a second-level property of a data source?
假设您为一个类Person
编写代码,该类Person
的属性由原始类型组成, 而一个Address
类则所有属性都是原始类型。 您将多个Person
对象放入ObservableCollection
并且想要将其绑定到DataGrid。 具有基本类型的属性将正常显示,但是由基本类型组成的类的属性Address
将仅显示“(Collection)”。
谷歌搜索时,我找到了解决该问题的方法,但是对于一些功能而言,这似乎需要大量工作。 我找到的解决方案是针对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>
无法将Address直接添加到DataGrid列的原因是因为该列需要原始类型,并且您发送了“ Address”类型对象。 要解决此问题,您必须创建一个Converter,将您的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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.