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