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

Eri*_*rik 1 c# sorting wpf datagrid mvvm

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

Ale*_*lex 6

我想这样做的"MVVM方式"是将DataGrid绑定到CollectionView表示对象集合的数据,并允许您通过SortDescription属性管理排序.

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

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

请注意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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后绑定datagrid:

<DataGrid ItemsSource="{Binding Path=CollectionView}">
Run Code Online (Sandbox Code Playgroud)

最后,如果要更改集合排序的属性,则应清除collectionview的sortdescriptions并添加如下所示的新属性:

_collectionView.SortDescriptions.Clear();
_collectionView.SortDescriptions.Add(new SortDescription("NewPropertyName", ListSortDirection.Ascending));
Run Code Online (Sandbox Code Playgroud)