具有复杂项的列表的数据绑定

本文关键字:列表 数据绑定 杂项 复杂 | 更新日期: 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的值?

具有复杂项的列表的数据绑定

根据您希望如何显示数据,您可以执行以下操作(这不是一个详尽的列表):

  1. 直接绑定Person.Food.taste
  2. Person类添加ToString()覆盖,并以您想要的方式返回字符串。如果不做额外的工作,您将无法以这种方式编辑它,但不确定是否需要编辑。
  3. 使用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");
    }
}