我们使用实体框架来检索我们的数据。我们试图将集合视图源绑定到组合框以显示数据。下面是CollectionViewSource的定义:
<CollectionViewSource x:Key="aSICodesControlledEnvironmentViewSource" d:DesignSource="{d:DesignInstance {x:Type AsiEF:ASICodesControlledEnvironment}, CreateList=True}">
AsiEF是实体框架集合。下面是组合框的XAML:
<ComboBox x:Name="cmbControlledEnvLast30" Margin="480,20,0,0" DisplayMemberPath="ContEnvDesc" SelectedValue="ContEnvDesc" Width="150" FontSize="14"
ItemsSource="{Binding Source={StaticResource aSICodesControlledEnvironmentViewSource}}">
<CollectionViewSource>
<CollectionViewSource.SortDescriptions>
<scm:SortDescription PropertyName="DisplayOrder" />
</CollectionViewSource.SortDescriptions>
</CollectionViewSource>
</ComboBox>
正如你所看到的,我们正在尝试按字段DisplayOrder排序数据,即使该字段在组合框中不可见,我仍然认为CollectionViewSource应该能够按该字段排序数据。
但是在尝试检索数据并将其分配给用户控件的加载事件中的集合视图源的Source时,这就失败了:
ComboBoxSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("aSICodesControlledEnvironmentViewSource")));
ComboBoxSource.Source = asiContext.ASICodesControlledEnvironments;
当试图分配CollectionViewSource对象ComboBoxSource的Source属性时,它挂在第二行。asiContext是AsiEF的ObjectContext。抛出的错误是,"在使用ItemsSource之前,Items集合必须为空"。抱歉,我不明白我们哪里做错了。我试过从XAML中删除ItemsSource的组合框中的分配,但这不起作用。那么,我们哪里出错了?
我认为您应该在CollectionViewSource
定义中声明SortDescriptions
<CollectionViewSource x:Key="aSICodesControlledEnvironmentViewSource"
d:DesignSource="{d:DesignInstance {x:Type AsiEF:ASICodesControlledEnvironment}, CreateList=True}">
<CollectionViewSource.SortDescriptions>
<scm:SortDescription PropertyName="DisplayOrder" />
</CollectionViewSource.SortDescriptions>
</CollectionViewSource>
,去除ComboBox
中多余的CollectionViewSource
。这将被解释为ComboBox.Items
,稍后当ComboBox.ItemsSource
被绑定时,它会抛出异常。
<ComboBox x:Name="cmbControlledEnvLast30"
ItemsSource="{Binding Source={StaticResource aSICodesControlledEnvironmentViewSource}}">
</ComboBox>