CollectionView实时排序回调

问题描述:

我有一个TreeView使用ListCollectionView与自定义IComprarer和生活塑造,以订购其子女。当当前选择的TreeViewItem在视图中重新排序时,我想TreeView自动滚动到TreeViewItem的新位置。但是,我无法找到ListCollectionView应用新排序时得到通知的方式,我想要的行为似乎并未纳入TreeViewControlCollectionView实时排序回调

ListCollectionView重新计算排序顺序时,我可以通知我吗?

+0

但ListCollectionView的人不能没有的东西hapening – Paparazzi 2014-09-26 19:24:09

+0

你说得对,我可以扎入每个项目的'PropertyChanged'事件,并听取更改申请一个新的排序,并侦听'TreeView'的'ItemsSource'上的'CollectionChanged'事件是为了将处理程序附加/分离到每个项目,但这是很多工作。工作'ListCollectionView'已经在表面下为我做了。如果我需要经过这么多的努力,我可能只是完全跳过实况整形,并在ViewModel中手动排序我的列表。 – 2014-09-26 19:40:11

+0

@NathanFriend是不是'CollectionChanged'应该做你想做的?你甚至尝试过处理这个事件吗? – 2014-09-26 19:53:03

我相信事件CollectionChanged是你需要的。你可以做这样的事情:

((ICollectionView)yourListCollectionView).CollectionChanged += handler; 

,我们要在这里投是CollectionChanged是为INotifyPropertyChanged成员(在这个界面ICollectionView继承)实现的原因,源代码在这里:

event NotifyCollectionChangedEventHandler INotifyCollectionChanged.CollectionChanged 
{ 
    add { 
      CollectionChanged += value; 
    } 
    remove { 
      CollectionChanged -= value; 
    } 
} 

这实施是明确。因此,作为公众成员,该活动隐藏了正常访问权限。要公开该成员,您可以将实例投射到ICollectionViewINotifyPropertyChanged

。当明确实现接口时,必须在能够访问接口成员之前将实例显式转换到该接口。

有关实现接口的实例:

public interface IA { 
    void Test(); 
} 
//implicitly implement 
public class A : IA { 
    public void Test() { ... } 
} 
var a = new A(); 
a.Test();//you can do this 


//explicitly implement 
public class A : IA { 
    void IA.Test() { ... } //note that there is no public and the interface name 
          // is required 
} 
var a = new A(); 
((IA)a).Test(); //this is how you do it.