【问题标题】:WPF datagrid: sort a column programatically the MVVM way?WPF datagrid:以编程方式以 MVVM 方式对列进行排序?
【发布时间】:2016-09-30 15:09:27
【问题描述】:

我有一个使用 WPF-Datagrid 的 WPF 应用程序。我可以单击列标题对列进行排序,这会自动运行。我想要的是在程序开始时以编程方式选择一列,然后对其进行排序。或者换一种说法:我想假装用户点击了列标题,但是以编程方式进行,MVVM 方式,省略后面代码的更改。有什么解决办法吗?

【问题讨论】:

  • 那么,您仍然希望用户点击列标题,但排序代码位于视图模型中?
  • 蒂莫西,不,我想你误解了:我希望以编程方式执行排序,而不需要用户按下列标题。或者换一种说法:我的数据网格的默认排序。是的,列标题显示正确的排序方向。

标签: c# wpf sorting mvvm datagrid


【解决方案1】:

如果你有列表,你可以使用 Linq 查询,如果你使用 DataTables,你可以使用 MyRows = myTable.Select(strExpr, strSort);

首先您必须选择要排序的列,然后在 viewmodel 中您可以使用 LINQ 或 myTable.Select(strExpr, strSort)

示例代码

 switch(columnname)
    {
    case "name":
    break;

    case "FatherName"
    break;
    }

【讨论】:

    【解决方案2】:

    我想这样做的“MVVM 方式”是将您的 DataGrid 绑定到代表您的对象集合的 CollectionView,并允许您通过 SortDescription 属性管理排序。

    例如,在您的视图模型中,您有一个对象集合:

    private ObservableCollection<Entity> _entityCollection = null;
    public ObservableCollection<Entity> EntityCollection
    {
        get
        {
            return _entityCollection;
        }
        set
        {
            _entityCollection = value;
            RaisePropertyChanged("EntityCollection");
            RaisePropertyChanged("CollectionView");
        }
    }
    

    注意上面的RaisePropertyChanged("CollectionView"):当你的集合发生变化时,应该通知视图集合视图也发生了变化。

    因此,与其将数据网格直接绑定到集合,不如定义一个只读的 collectionview 属性,如下所示:

    private CollectionView _collectionView = null;
    public CollectionView CollectionView
    {
        get
        {
            _collectionView = (CollectionView)CollectionViewSource.GetDefaultView(EntityCollection);
            if (_collectionView != null)
                _collectionView.SortDescriptions.Add(new SortDescription("PropertyName", ListSortDirection.Ascending));
            return _collectionView;
        }
    }
    

    然后你绑定你的数据网格:

    <DataGrid ItemsSource="{Binding Path=CollectionView}">
    

    最后,如果您想更改对集合进行排序的属性,您应该清除集合视图的 sortdescriptions 并添加一个新的,如下所示:

    _collectionView.SortDescriptions.Clear();
    _collectionView.SortDescriptions.Add(new SortDescription("NewPropertyName", ListSortDirection.Ascending));
    

    【讨论】:

    • 我有带有复选框的列的网格。我想在顶部的复选框中显示选定的项目。我正在尝试以这种方式实现。但是排序对我不起作用@Alex
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 2010-12-24
    • 2013-06-02
    • 2021-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多