【问题标题】:How can I make my bound WPF DataGrid sortable?如何使绑定的 WPF DataGrid 可排序?
【发布时间】:2011-01-31 15:34:29
【问题描述】:

我的 WPF4 DataGrid 绑定到一个不可排序的集合 - ObjectResult(of t) 。我不知道如何改用 ListCollectionView 之类的可排序集合。

详细信息:当应用程序加载时,用户启动搜索以填充 DataGrid 和其他可编辑控件。为了执行搜索,我正在构建一个基于用户过滤器选择的 ObjectQuery(of t)。 ObjectQuery 的 Execute 方法返回我设置为 CollectionViewSource.Source 的 ObjectResult。在 XAML 中,DataGrid 绑定到 CollectionViewSource,它是我创建的屏幕的 DataContext。

System.Data.Objects.ObjectQuery<LabSample> labSamplesQuery = this.GetLabSamplesFiltered_Query(_labEntitiesContext, sampleID_LIKE, xxx_LIKE, yyy_LIKE); 
System.Data.Objects.ObjectResult<LabSample> labSamples =  labSamplesQuery.Execute(System.Data.Objects.MergeOption.AppendOnly);
_labSamplesCollectionViewSource.Source = labSamples;      

因为 DataGrid 绑定到 ObjectResult(of t),所以它不可排序。 在将我的查询结果 (labSamples) 分配为我的数据源 (CollectionViewSource.Source) 之前,如何将其放入可排序和可更新的集合中

【问题讨论】:

  • 您需要收藏可更新吗?
  • 是的。这似乎是一个基本要求——用户搜索数据,我将结果转储到网格中,以便用户可以编辑记录。哪里有网页或视频来学习如何做到这一点?我将 Aaron 的回答标记为接受的有点太早了。他的回答给了我一个以 ICollectionView 作为 DataGrid.ItemsSource 的可排序网格,但我的其他控件不再绑定。我希望我的表单的 DataContext 与我用于 DataGrid 的 ItemSource 的任何内容相匹配。

标签: wpf entity-framework-4 binding wpfdatagrid


【解决方案1】:

由于延迟加载,WPF DataGrid 将无法排序。您需要使用 ToList() 方法,如下所示: ...... _labSamplesCollectionViewSource.Source = labSamples.ToList();现在数据网格应该是可排序的。

【讨论】:

    【解决方案2】:

    您可以使用ICollectionView 包装您的收藏并将其返回到您绑定的DataGrid

        private ICollectionView _view;
    
        public ICollectionView Samples
        {
            get 
            {
                if (_view == null)
                {
                    _view = CollectionViewSource.GetDefaultView(new ObservableCollection<LabSample>(labSamples));
                    _view.SortDescriptions.Add(new SortDescription("PropertyName", ListSortDirection.Ascending));
                }
    
                return _view;
            }
        }
    

    您还可以在 XAML 中设置排序逻辑。 Bea 有一篇关于实现这一目标的文章here。如果您将ObservableCollection&lt;LabSamples&gt; 设为类级别变量或包含在持有包装引用的服务中,您的更改将反映在DataGrid 中。

    【讨论】:

    • 这是我一直在网上搜索的答案。谢谢!我可以将 ICollectionView 分配为我的 _labSamplesCollectionViewSource.Source 并将其用作所有可编辑控件的 DataContext 吗?
    • 在上面的示例中,Samples 属性将是对象上的属性,该对象将是给定视图的 ViewModel 或 DataContext。在您的 XAML 中,您可以直接绑定到 Samples,因为在我们调用 GetDefaultView 时已经包装了基础集合;试一试就足够了。如果您想坚持使用显式 CollectionViewSource,您需要将 _labSamplesCollectionViewSource.Source 分配给新定义的 ObservableCollection,然后您的 CollectionViewSource.View 将包含对 ICollectionView 的引用。
    • 此外,ICollectionView 实现了 IEnumerable,因此您引用的任何其他不再绑定的控件都应该能够像以前那样绑定。您能否更新您的问题以包含有关其他控件的信息?如果您只想要一个带有通知更改的集合,请包装您的结果...new ObservableCollection(labSamples)
    • 我说这个答案有点太快了。当我将 DataGrid.ItemsSource 设置为创建的 _view 时,您给出的答案效果很好。但我不知道现在将什么用作可编辑控件的 DataContext(我的问题就在上面)。如果有人知道用于创建最初由用户过滤器填充的基本 WPF 和 EF 数据输入表单的良好资源,请告诉我。过滤器/搜索可能会变得复杂,所以我希望使用可组合的 LINQ ObjectQuery(of t)。
    • @DeveloperDan 您之前使用什么作为 DataContext?
    猜你喜欢
    • 2017-08-05
    • 2010-11-15
    • 2015-07-02
    • 2011-08-23
    • 1970-01-01
    • 2015-06-22
    • 2018-07-28
    • 1970-01-01
    • 2014-08-23
    相关资源
    最近更新 更多