此问题是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,我想。这是在添加第一个收集项后立即发生的。如果这是由于事物的设置顺序,那么是否有任何改变建议?
答案 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();
}
});
}
我对你声称该系列中的第一个项目是重复的感到困惑。没有显示的代码,也没有我给你的代码,可能会产生这种效果。您必须共享演示该问题的代码。