在ObservableCollection <t> .Move </t>之后,CollectionView with Filter未更新

时间:2010-10-19 18:28:06

标签: .net wpf

使用.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的顺序并在它更改时更新吗?

谢谢, 凯文

1 个答案:

答案 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更新。