gpt4 book ai didi

c# - 更改源后 ICollectionView 排序不起作用

转载 作者:太空宇宙 更新时间:2023-11-03 12:37:32 26 4
gpt4 key购买 nike

我有一个使用 Entity Framework 查询数据库并将结果放在 ICollectionView 中的方法。 ICollectionView 充当 DataGridItemsSource。第一次查询一切正常,但在第二次查询时,尽管应用了正确的 SortDescriptions,但数据没有正确排序。

这是我尝试查询和分组/排序数据的代码:

    CollectionViewSource cvsRS;

private ObservableCollection<productorder> rs;
public ObservableCollection<productorder> RS
{
get { return rs; }
set
{
if (rs != value)
{
rs = value;
OnPropertyChanged("RS");
}
}
}

private ICollectionView rsView;
public ICollectionView RSView
{
get { return rsView; }
set
{
if (rsView != value)
{
rsView = value;
OnPropertyChanged("RSView");
}
}
}

public void QueryDatabase()
{

RS = new ObservableCollection<productorder>(DatabaseEntities.productorders.Where(o => o.month.id == CurrentMonth.id));
if (RS != null)
{
cvsRS.Source = RS;
RSView = cvsRS.View;

RSView.GroupDescriptions.Clear();
RSView.GroupDescriptions.Add(new PropertyGroupDescription("producttype.productcategory.name"));
RSView.GroupDescriptions.Add(new PropertyGroupDescription("producttype.name"));

RSView.SortDescriptions.Clear();
RSView.SortDescriptions.Add(new SortDescription("producttype.productcategory.sortorder", ListSortDirection.Ascending));
RSView.SortDescriptions.Add(new SortDescription("client.name", ListSortDirection.Ascending));
RSView.Refresh();
CurrentRecord = null;
SelectedRecords = null;
}
}

分组工作正常,但根据排序,分组的顺序不正确。我已经尝试了许多可能的“修复”但没有成功(例如,将排序/分组描述直接添加到 CollectionViewSource,在分组之前排序,删除一些排序/分组,删除 SortDescriptionsCollectionViewSource does not re-sort on property change )。

有谁知道无论执行了多少查询如何保持排序顺序?如果可能的话,我愿意接受在 DataGrid 中查询显示数据的替代方法。

最佳答案

尝试绑定(bind)您的 CollectionViewSource.Source属性(property)给你ObservableCollection<T>属性(property)。在 View 模型构造函数中设置绑定(bind)。然后,别管它了。更新 ObservableCollection<T> ,替换它,等等。只要它是 ObservableCollection<T>及其公共(public)属性(property)筹集PropertyChanged每当您更换它时,整个系统都会正常工作。

public MyViewModel()
{
BindCollectionViewSource();
}

protected void BindCollectionViewSource()
{
cvsRS = new CollectionViewSource();

var binding = new Binding
{
Source = this,
Path = new PropertyPath("RS")
};
BindingOperations.SetBinding(cvsRS, CollectionViewSource.SourceProperty, binding);
}

// Since we're not going to be messing with cvsRS or cvsRS.View after the
// constructor finishes, RSView can just be a plain getter. The value it returns
// will never change.
public ICollectionView RSView
{
get { return cvsRS.View; }
}

您不能只将绑定(bind)分配给 Source ;不仅如此。 Source="{Binding RSView}"您在 XAML 中看到的东西可能看起来像一个赋值,但为了方便起见,一些细节被隐藏了。 Binding积极做事。它需要知道目标对象是谁。

我确实看到一件有趣的事:我给了我的测试代码一个PropertyGroupDescription和一个SortDescription .当我将项目添加到集合中时,它会在组内对它们进行排序。然后当我调用 RSView.Refresh() 时,它在不引用组的情况下使用它们。不确定我明白它在那里做什么。

关于c# - 更改源后 ICollectionView 排序不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40343890/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com