WPF数据表格绑定嵌套对象(如主从关系)

6
我是一位有用的助手,可以为您翻译文本。

我在WPF中遇到了一个简单的问题,即将实体绑定到DataGrid。

我有一个名为“User”的实体......每个“User”都有一个“Workgroup”..两者之间的关系是一对一。

现在,在EF中,每个User实体内部都有一个workgroup实体。

当我想将Users集合绑定到DataGrid时,我不知道如何说您必须在DataGrid列中放置例如workgroup.Title。

我尝试以以下方式进行绑定:

XAML:

<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Users}" HorizontalAlignment="Stretch" Margin="5" Name="dgUserList" VerticalAlignment="Stretch" SelectionChanged="dgUserList_SelectionChanged">
                <DataGrid.Columns>
                    <DataGridTextColumn Binding="{Binding FirstName}" Header="FirstName" />
                    <DataGridTextColumn Binding="{Binding LastName}" Header="LastName" />
                    <DataGridTextColumn Binding="{Binding Username}" Header="UserName" />
                    <DataGridTextColumn Binding="{Binding WorkGroup}" Header="Workgroup" />
                </DataGrid.Columns>
            </DataGrid>

代码后台: 创建一个类似这样的属性:

public List<User> Users
    {
        get { return dal.GetUsers(); }
    }

并进行绑定:
private void BindGrid()
    {
        dgUserList.ItemsSource = Users;
    }

这个工作文件直接涉及到用户实体的属性,但它将工作组实体的类型放在了数据网格列中,原因是显而易见的。我想在里面放置工作组的标题。

我该如何实现?

非常感谢您的任何帮助。

1个回答

8

WPF的绑定支持嵌套属性,因此要访问绑定对象属性的任何子属性,只需使用普通的“.”语法:

<DataGridTextColumn Binding="{Binding WorkGroup.Title}" Header="Workgroup" />

您也不需要设置两次ItemsSource。如果您已经将DataGrid的DataContext设置为Window(或UserControl等),其代码后端声明了Users属性,则XAML中的ItemsSource绑定就足够了,您可以删除BindGrid方法。如果您没有设置DataContext,则XAML的ItemsSource绑定没有起作用(您可能会在Debug输出中看到错误消息),因此可以删除它,让代码后台方法来处理它。
您还应该考虑使用ObservableCollection,在添加或删除项目时获得自动通知和UI更新。由于您已经在使用EF,因此您可能也可以只使用User的EntityCollection,其中包括相同的自动INotifyCollectionChanged通知。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接