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

时间:2011-07-12 20:23:58

标签: wpf data-binding datagrid entity master-detail

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

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

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

当我想将Users Collection绑定到datagrid时,我不知道你必须将forexample workgroup.Title放在datagrid列中

我正试图以这种方式绑定:

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;
    }

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

我怎么能做到这一点?

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:8)

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

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

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

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