【问题标题】:Data binding of a list with complex items具有复杂项目的列表的数据绑定
【发布时间】:2015-08-07 05:25:46
【问题描述】:

我正在尝试将 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 中。 现在它正在显示用户名的值和人员的值。

但我想显示对象人内部属性。 假设调用 person 的对象属于 Food 类型,并且有一个名为 taste 的属性。

如何让DataGrid显示username的值和Person.taste的值?

【问题讨论】:

  • 您已经回答了自己的问题:{Binding Person.taste} 但它必须是公共财产。你试过了吗?

标签: c# wpf xaml data-binding datagrid


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2015-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多