带有嵌套对象的wpf datagrid数据绑定(如主细节)

Pou*_*yan 6 data-binding wpf datagrid entity master-detail

我有一个简单的问题,将实体绑定到wpf中的datagrid.

我有一个名为"用户"的实体....每个"用户"都有一个"工作组"......两者之间的关系是一对一的.

现在在EF中,每个用户实体内部都有一个工作组实体.

当我想将Users Collection绑定到datagrid时,我不知道你必须在datagrid列中放置forexample 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>
Run Code Online (Sandbox Code Playgroud)

Code Behind:创建了这样的属性:

public List<User> Users
    {
        get { return dal.GetUsers(); }
    }
Run Code Online (Sandbox Code Playgroud)

并做绑定:

private void BindGrid()
    {
        dgUserList.ItemsSource = Users;
    }
Run Code Online (Sandbox Code Playgroud)

此工作文件具有User Entity的直接属性,但它将Workgroup实体的类型放在datagrid列中,原因很明显.我想把工作组的标题放在里面

我怎么能做到这一点?

任何帮助将不胜感激

Joh*_*wen 8

WPF Bindings支持嵌套属性,因此只需使用普通的"."来获取绑定对象的属性上的任何子属性.句法:

<DataGridTextColumn Binding="{Binding WorkGroup.Title}" Header="Workgroup" />
Run Code Online (Sandbox Code Playgroud)

您也不需要设置ItemsSource两次.如果将DataGrid的DataContext设置为Window(或UserControl等),其代码隐藏声明了Users属性,那么XAML中的ItemsSource绑定就足够了,您可以删除BindGrid方法.如果你还没有设置DataContext,那么XAML ItemsSource Binding没有做任何事情(你可能会在Debug Output中看到一条错误消息),所以你可以删除它并让代码隐藏方法来处理它.

您还应该考虑使用ObservableCollection在添加或删除项目时获取自动通知和UI更新.由于您已经在使用EF,因此您也可以只使用EntityCollection for User,其中包含相同的自动INotifyCollectionChanged通知.