我在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