WPF datagrid:以编程方式对MVVM方式进行排序?

时间:2016-06-01 10:00:06

标签: c# wpf sorting mvvm datagrid

我有一个使用WPF-Datagrid的WPF应用程序。我可以单击列标题对列进行排序,这些列会自动生效。我想要的是在程序启动时以编程方式选择一列然后进行排序。或者换句话说:我想假装用户已经点击了列标题,但是以编程方式执行,MVVM方式,省略了后面代码的更改。对此有什么解决方案吗?

2 个答案:

答案 0 :(得分:5)

我认为执行此操作的“MVVM方式”是将DataGrid绑定到代表对象集合的CollectionView,并允许您通过SortDescription属性管理排序。

例如,在您的viewmodel中,您有一组对象:

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

请注意上面的RaisePropertyChanged("CollectionView"):当您的收藏集发生变化时,应该通知视图收集视图也已更改。

因此,不是将datagrid直接绑定到集合,而是定义一个只读的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:

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

最后,如果您想要更改集合排序的属性,您应该清除collectionview的sortdescriptions并添加一个新的类似:

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

答案 1 :(得分:0)

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

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

示例代码

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

    case "FatherName"
    break;
    }