RowDetailsTemplate ItemSource Binded to an EF NavigationProp
本文关键字:EF NavigationProp an to ItemSource Binded RowDetailsTemplate | 更新日期: 2023-09-27 18:31:59
我有一个Person
对象的DataGrid
,其RowDetailsTemplate
中还有另一个DataGrid
,其中包含所选人员的作业,我正在使用EntityFramework
生成DataContext
,每个人都至少有一个作业(因此Person包含另一个类型为PersonWork
对象的外键)。为了用 selectedPerson's
工作填充RowDetails
DataGrid
,我已将其(RowDetailsTemplate)itemSource
绑定到 Person
类(由 EF 生成)的导航属性,但 RowDetails
Grid 始终为空!(当我使用即时窗口检查SelectedPerson.PersonWork
时,它包含记录)
这是我使用Xaml
代码:
<DataGrid Style="{StaticResource DataGridStyle}" AutoGenerateColumns="False" EnableRowVirtualization="True" ItemsSource="{Binding ListPersons}" SelectedItem="{Binding SelectedPerson,Mode=TwoWay}" >
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding PersonName}" Header="Name" Width="SizeToHeader" MinWidth="100"/>
<DataGridTextColumn Binding="{Binding PersonAge}" Header="Age" Width="SizeToHeader" MinWidth="100"/>
</DataGrid.Columns>
<DataGrid.RowDetailsTemplate>
<DataTemplate >
<DataGrid Height="100" AutoGenerateColumns="False" EnableRowVirtualization="True" ItemsSource="{Binding Path=SelectedPerson.PersonWorks}">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding WorkID}" Header="WorkID" Width="SizeToHeader" MinWidth="100"/>
<DataGridTextColumn Binding="{Binding WorkTitle}" Header="Title" Width="SizeToHeader" MinWidth="100"/>
<DataGridTextColumn Binding="{Binding WorkRecommandation}" Header="Recommandation" Width="SizeToHeader" MinWidth="300"/>
</DataGrid.Columns>
</DataGrid>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>
EF 生成的类人员如下所示:
public partial class Person
{
public Person()
{
this.PersonWorks = new HashSet<PersonWorks>();
}
public long PersonId { get; set; }
public string PersonName { get; set; }
public long PersonAge { get; set; }
public virtual ICollection<PersonWork> PersonWorks { get; set; }
}
PS:我正在使用EF 6.1.1
更新 ListPersons是一个ObservableCollection
,它的实例化方式如下:
var _dbContext=new DBEntities();
ListPersons= new ObservableCollection<Person>(_dbContext.Persons);
为了实现这一点,您还必须在内部 DataGrid 中指定 DataContext,或者使用 ElementName 直接从主 DataGrid 获取内部 DataGrid 导航属性集合,以下代码完美运行:
<DataGrid x:Name="DataGrid" Style="{StaticResource DataGridStyle}" AutoGenerateColumns="False" EnableRowVirtualization="True" ItemsSource="{Binding ListPersons}" SelectedItem="{Binding SelectedPerson,Mode=TwoWay}" >
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding PersonName}" Header="Name" Width="SizeToHeader" MinWidth="100"/>
<DataGridTextColumn Binding="{Binding PersonAge}" Header="Age" Width="SizeToHeader" MinWidth="100"/>
</DataGrid.Columns>
<DataGrid.RowDetailsTemplate>
<DataTemplate >
<DataGrid Height="100" AutoGenerateColumns="False" EnableRowVirtualization="True" ItemsSource="{Binding Path=SelectedItem.PersonWorks, ElementName=DataGrid}">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding WorkID}" Header="WorkID" Width="SizeToHeader" MinWidth="100"/>
<DataGridTextColumn Binding="{Binding WorkTitle}" Header="Title" Width="SizeToHeader" MinWidth="100"/>
<DataGridTextColumn Binding="{Binding WorkRecommandation}" Header="Recommandation" Width="SizeToHeader" MinWidth="300"/>
</DataGrid.Columns>
</DataGrid>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>