使用.NET 3.5,我发现当底层的ObservableCollection(T)使用ObservableCollection(T)移动项目时,带有过滤器的CollectionView不会更新.Move。作为一个完整性检查,我从这个页面开始了一个简单的项目,Bea Stollnitz之一:http://bea.stollnitz.com/blog/?p=31。实际项目可以在这里下载:bea.stollnitz.com/files/28/FilterSample.zip。如果你进入她的Window1.xaml文件并添加如下按钮:
<StackPanel>
<Button Content="Blah" Click="Button_Click"/>
然后像这样添加点击处理程序:
private void Button_Click(object sender, RoutedEventArgs e) {
GreekGods src1 = this.Resources["src1"] as GreekGods;
src1.Move(0, 1);
}
您会发现按下按钮不会导致窗口发生任何变化。但是,如果您在构造函数中注释掉代码行:
collectionView.Filter = new Predicate<object>(FilterOutA);
然后按下按钮,你会看到两个顶部元素交换位置。
那我错过了什么?这是一个错误,或者在应用过滤器时CollectionView是否会丢失此功能?我可以理解你是否已经对CollectionView进行了排序,然后更改基础顺序不会改变CollectionView的顺序,但这不是真的。不应该只是在CollectionView上有一个Filter继续显示底层的ObservableCollection的顺序并在它更改时更新吗?
谢谢, 凯文
答案 0 :(得分:1)
不,这不是一个错误,并且工作正常。请参阅,在该示例中,这是源集合中项目的顺序:
[0]金星
[1]阿波罗
[2]火星
现在,如果您应用“FilterOutA”,“Apollo”将被删除,因此列表框将只显示:
[0]金星
[1] Apollo&lt; -Filtered out
[2]火星
鉴于此,调用src1.Move(0,1)
将基本上将“Venus”移动到索引1.因此,在过滤后的集合中,它似乎没有任何变化。
[0] Apollo&lt; -Filtered out
[1]金星
[2]火星
这里需要注意的是Move()方法适用于原始集合,而不适用于已过滤的集合。
尝试将移动操作更改为src1.Move(0,2)
,您将看到UI更新。