0

我在 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 中执行此操作?员工 Combobox 应在 Company Combobox 中更改 SelectedItem 时自行更新。

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

4

1 回答 1

0

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

所以在 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 和实体框架将为您获取所需的数据。并且只有拥有匹配公司的员工。

我所做的是使用一个用户控件作为我的视图,并有一个网格/用户控件/内容控件,它将绑定(设置其数据上下文)到我的视图中的 SelectedCompany。

IE

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

然后在该内容控件中,如果您仍希望拥有 selectedemployee 绑定,则组合框或数据网格或列表视图的绑定如下:

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

但是,如果您不需要 selectedEMployee,您可以绑定到 company 表中的 EMployeeID,如下所示:

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

您只需直接绑定到导航属性并使用员工外键。

我刚刚输入了这些,因此您可能需要仔细检查所有名称等。希望这些选项有所帮助

编辑1:

包括示例(在 vb.net 中)

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

请参阅:包含方法 MSDN 文档

于 2013-04-03T17:33:57.433 回答