我有一个简单的问题,将实体绑定到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列中,原因很明显。我想把工作组的标题放在
中我怎么能做到这一点?
任何帮助将不胜感激
答案 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通知。