列表与复杂项目的数据绑定

时间:2015-05-25 17:29:04

标签: c# wpf xaml data-binding datagrid

我尝试将类型用户列表绑定到包含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中。 现在它显示了用户名的值和人的价值。

但我想显示对象人内部属性。 让我们说,呼叫人的对象是食物类型,并且具有称为品味的属性。

如何让DataGrid显示用户名的值和 Person.taste 的值?

1 个答案:

答案 0 :(得分:0)

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

  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>
    
  4. 修改:根据您的跟进,如果您希望列显示不同类型对象的不同数据,则需要使用我提到的DataGridTemplateColumn,设置{{1} }为每种类型的数据,并创建一个模板选择器来选择正确的数据。因此,您的专栏将如下所示:

    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>