具有实体框架的WPF MVVM主详细信息集合

具有实体框架的WPF MVVM主详细信息集合,wpf,mvvm,entity-framework-4,master-detail,Wpf,Mvvm,Entity Framework 4,Master Detail,我在WPF中有两个组合框,都绑定到ViewModel下的ObservableCollections: <ComboBox ItemsSource="{Binding Companies}" SelectedItem="{Binding Path=SelectedCompany,Mode=TwoWay}" /> <ComboBox ItemsSource="{Binding Employees}" SelectedItem="{Binding Path=SelectedEmplo

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

<ComboBox ItemsSource="{Binding Companies}" SelectedItem="{Binding Path=SelectedCompany,Mode=TwoWay}" />
<ComboBox ItemsSource="{Binding Employees}" SelectedItem="{Binding Path=SelectedEmployee,Mode=TwoWay}" />
在初始化ViewModel时,我询问存储库中的所有公司(该存储库本身使用Linq to Entities查询),该查询将公司返回为IEnumerable(Of Company):

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

如何在ViewModel中执行此操作?员工组合框应在公司组合框中更改SelectedItem时自动更新


公司和员工在实体框架内有一对多的关系。我能利用这个事实吗?我是否可以通过缓存数据以某种方式避免重复Linq到实体查询?

您可以绑定到实体框架的导航属性。使用公司组合框的可观察集合,并将员工组合框绑定到导航属性

因此,在ViewModel中,您只需要:

Public Property Companies As ObservableCollection(Of Company)
Public Property SelectedCompany As Company
Public Property SelectedEmployee As Employee
假设您的实体框架在名为company\u employee的公司实体上有一个导航属性。您可以在视图中直接绑定到它,如:

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

请参阅:

Ok。这是否有效?我的意思是,假设相应的员工数据已加载一次,则不会在每次更改所选公司时命中数据库?(不幸的是,我不能在这里分析数据库查询)我想这取决于你为什么不希望数据库命中。如果您有1000条记录,并且您的用户只与其中的几条进行了交互,那么您的数据库只会被命中几次,但是如果您想在初始查询时加载导航属性,可以使用include方法来完成。有关包含选项,请参见编辑的答案。
Public Property Companies As ObservableCollection(Of Company)
Public Property SelectedCompany As Company
Public Property SelectedEmployee As Employee
<ComboBox ItemsSource="{Binding SelectedCompany.company_employee}" SelectedItem="{Binding Path=SelectedEmployee,Mode=TwoWay}" />
<ContentControl Name="DetailControl" DataContext="{Binding Path=SelectedCompany, Mode=TwoWay}" >
<ComboBox ItemsSource="{Binding company_employee}" SelectedValue="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}},Path=DataContext.SelectedEmployee}" />
<ComboBox ItemsSource="{Binding company_employee}" SelectedValue="{Binding EmplyeeID, Mode=TwoWay" />
 Dim MyQuery As IQueryable(Of Company) = CType((From MyResults In Context.Company.Include("Employee") Select MyResults), IQueryable(Of Company))