为什么我的排序行为仅在列表中的一个项目中触发,并且仅在第一次添加集合时触发?

时间:2017-11-28 18:44:40

标签: c# wpf sorting observablecollection

此问题是this problem修复的结果。在获得排序行为以正确排序ObservableCollection之后,我现在注意到第一次添加集合时,CustomSorter处理程序仅触发其中的第一个项目,并且传递相同的项目作为方法的两个参数。这就是在列表中产生一个重复的项目。

以下是视图模型代码的相关部分:

public ObservableCollection<PermissionItemViewModel> PermissionItems { get; private set; }

private void FetchRoleData()
{
    PermissionItems.Clear();

    if (SelectedRole != null)
    {
        using (var context = new myDataContext(new myDbFactory().GetConnectionString()))
        {
            foreach (PermissionsEnum permission in Enum.GetValues(typeof(PermissionsEnum)))
                PermissionItems.Add(new PermissionItemViewModel(permission, SelectedRole[permission]));
        }
    }
}

该集合的所有后续操作都不会这样做......它只会在第一次通过FetchRoleData方法时发生。为什么呢?

修改

一些其他信息。当CustomSort触发其CollectionViewSource事件(唯一具有AFAIK的事件)时,会设置Filter属性。我无法想出任何更好的触发器来设置它。 OnAttached覆盖太快了,因为View的{​​{1}}成员尚未设置。抓住22,我想。这是在添加第一个收集项后立即发生的。如果这是由于事物的设置顺序,那么是否有任何改变建议?

1 个答案:

答案 0 :(得分:1)

我不知道您是如何或在何处设置过滤器处理程序的。以下是在CollectionViewSource属性发生更改时如何在View上设置自定义排序的示例。那是你想要的时候。这假设它位于Window的资源中(或者至少是Window可以找到它的某个位置)。但是一旦你拥有cvs,无论它来自哪里,然而你得到了你的手套,其余的都是一样的。

public MainWindow()
{
    InitializeComponent();

    var cvs = FindResource("MyCollectionViewSource1") as CollectionViewSource;

    var dpdView = DependencyPropertyDescriptor.FromProperty(
                      CollectionViewSource.ViewProperty, typeof(CollectionViewSource));

    dpdView.AddValueChanged(cvs, (s, e) =>
    {
        if (cvs.View is ListCollectionView lvc)
        {
            lvc.CustomSort = new CustomSorter();
        }
    });
}

我对你声称该系列中的第一个项目是重复的感到困惑。没有显示的代码,也没有我给你的代码,可能会产生这种效果。您必须共享演示该问题的代码。