具有复杂项的列表的数据绑定
本文关键字:列表 数据绑定 杂项 复杂 | 更新日期: 2023-09-27 17:50:38
我正试图将类型User的列表绑定到具有2列的数据网格中。
类用户:
public class User
{
private string username;
private string password;
private Object person;
public User(string _username, string _password, Object _person=null)
{
username = _username;
password = _password;
person = _person;
}
public string UserName
{
get { return username; }
set { username = value; }
}
public string Password
{
get { return password; }
set { password = value; }
}
public Object Person
{
get { return person; }
set { person = value; }
}
main.xaml:
<DataGrid Name="UserGrid" ItemsSource="{Binding}">
<DataGrid.Columns>
<DataGridTextColumn Header="User name" Binding="{Binding UserName}"/>
<DataGridTextColumn Header="Person" Binding="{Binding Person}"/>
</DataGrid.Columns>
</DataGrid>
main.xaml.cs
UserGrid.DataContext = listOfUsers;
这段代码工作正常!它将用户列表绑定到DataGrid中。现在显示username的值和person的值。
但是我想显示对象人的内部属性。假设称为person的对象的类型为Food,并且具有名为taste的属性。
如何使DataGrid显示用户名的值和Person.taste的值?
根据您希望如何显示数据,您可以执行以下操作(这不是一个详尽的列表):
- 直接绑定
Person.Food.taste
- 为
Person
类添加ToString()
覆盖,并以您想要的方式返回字符串。如果不做额外的工作,您将无法以这种方式编辑它,但不确定是否需要编辑。 -
使用
DataGridTemplateColumn
以您想要的任何自定义方式显示数据(并在需要时处理您自己的编辑)。例如:<DataGridTemplateColumn Header="Person"> <DataGridTemplateColumn.CellTemplate> <DataTemplate DataType="{x:Type local:User}"> <!-- Put any template you want here --> <TextBlock Text="{Binding Person.Food.taste}" /> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn>
编辑:根据您的后续操作,如果您想让列显示不同类型对象的不同数据,那么您需要使用我提到的DataGridTemplateColumn
,为每种类型的数据设置DataTemplate
,并创建模板选择器以选择正确的一个。因此,您的列看起来像这样:
<DataGridTemplateColumn Header="Rank">
<DataGridTemplateColumn.CellTemplateSelector>
<local:RankTemplateSelector>
<local:RankTemplateSelector.EmployeeTemplate>
<DataTemplate DataType="{x:Type local:Employee}">
<TextBlock Text="{Binding Rank}" />
</DataTemplate>
</local:RankTemplateSelector.EmployeeTemplate>
<local:RankTemplateSelector.CustomerTemplate>
<DataTemplate DataType="{x:Type local:Customer}">
<TextBlock Text="N/A" />
</DataTemplate>
</local:RankTemplateSelector.CustomerTemplate>
<local:RankTemplateSelector.ClubMemberTemplate>
<DataTemplate DataType="{x:Type local:ClubMember}">
<TextBlock Text="N/A" />
</DataTemplate>
</local:RankTemplateSelector.ClubMemberTemplate>
</local:RankTemplateSelector>
</DataGridTemplateColumn.CellTemplateSelector>
</DataGridTemplateColumn>
你的模板选择器看起来像这样:
class RankTemplateSelector : DataTemplateSelector
{
public DataTemplate EmployeeTemplate { get; set; }
public DataTemplate CustomerTemplate { get; set; }
public DataTemplate ClubMemberTemplate { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
if (item == null) return null;
if (item is Employee) return EmployeeTemplate;
if (item is Customer) return CustomerTemplate;
if (item is ClubMember) return ClubMemberTemplate;
throw new ArgumentException("The type of the item is not recognized", "item");
}
}