使用实体框架的WPF MVVM主-细节集合



我在WPF中有2个组合框,都绑定到ViewModel下的ObservableCollections:

<ComboBox ItemsSource="{Binding Companies}" SelectedItem="{Binding Path=SelectedCompany,Mode=TwoWay}" />
<ComboBox ItemsSource="{Binding Employees}" SelectedItem="{Binding Path=SelectedEmployee,Mode=TwoWay}" />

在ViewModel我有:

Public Property Companies As ObservableCollection(Of Company)
Public Property Employees As ObservableCollection(Of Employee)
Public Property SelectedCompany As Company
Public Property SelectedEmployee As Employee

在初始化ViewModel时,我从存储库(它本身使用Linq-to-Entities查询)中询问所有公司,该查询将公司作为IEnumerable (Of Company)返回:

Public Sub New()    
    Companies = New ObservableCollection(Of Company)(_CompanyRepo.GetAll())
End Sub

到目前为止一切正常。但是现在我需要将数据获取到Employees集合中(它也有一个存储库,用于返回IEnumerable),并且在任何时候都只需要所选公司的Employees数据。

我如何在ViewModel中做到这一点?员工组合框应该在公司组合框中的SelectedItem更改时更新自身。

Company和Employee在实体框架内具有一对多关系。我可以利用这个事实吗?我是否可以通过缓存数据来避免重复Linq-to-Entity查询?

可以绑定到实体框架的导航属性。为Company组合框使用一个可观察集合,并将employee组合框绑定到navigation属性。

所以在ViewModel中你只需要:

Public Property Companies As ObservableCollection(Of Company)
Public Property SelectedCompany As Company
Public Property SelectedEmployee As Employee

假设你的实体框架在你的公司实体上有一个名为company_employee的导航属性。你可以在视图中直接绑定到它,比如:

<ComboBox ItemsSource="{Binding SelectedCompany.company_employee}" SelectedItem="{Binding Path=SelectedEmployee,Mode=TwoWay}" />

WPF和实体框架将为您获取所需的数据。只有员工才有匹配的公司。

我所做的是使用usercontrol作为我的视图,并有一个网格/usercontrol/contentcontrol,将绑定(设置其数据上下文)到SelectedCompany在我的视图。

ie

<ContentControl Name="DetailControl" DataContext="{Binding Path=SelectedCompany, Mode=TwoWay}" >

如果你仍然想要一个selecteemployee绑定,那么在这个contentcontrol中,combox或datagrid或listview的绑定如下:

<ComboBox ItemsSource="{Binding company_employee}" SelectedValue="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}},Path=DataContext.SelectedEmployee}" />

但是如果您不需要selecteemployee,您可以只绑定到公司表中的EMployeeID,如下所示:

<ComboBox ItemsSource="{Binding company_employee}" SelectedValue="{Binding EmplyeeID, Mode=TwoWay" />

您只需直接绑定到navigation属性并使用employee外键。

我只是把这些打出来,所以你可能需要仔细检查所有的名字等等。希望这些选项有帮助

编辑1:

包含示例(在vb.net中)

 Dim MyQuery As IQueryable(Of Company) = CType((From MyResults In Context.Company.Include("Employee") Select MyResults), IQueryable(Of Company))

参见:Include Method MSDN Documentation

最新更新