【问题标题】:CollectionView live sorting callbackCollectionView 实时排序回调
【发布时间】:2014-09-26 19:06:25
【问题描述】:

我有一个TreeView,它使用带有自定义IComprarerListCollectionView 和实时整形来订购它的孩子。当当前选定的TreeViewItem 在视图中重新排序时,我希望TreeView 自动滚动到TreeViewItem 的新位置。但是,当ListCollectionView 应用新排序时,我找不到通知的方法,并且我想要的行为似乎没有内置到TreeViewControl 中。

ListCollectionView 重新计算其排序顺序时,有什么方法可以通知我?

【问题讨论】:

  • 但是 ListCollectionView 不应该应用新的排序而没有一些事情发生
  • 你说得对,我可以绑定到每个项目的 PropertyChanged 事件并监听变化,并在 TreeViewItemsSource 上监听 CollectionChanged 事件以附加/将处理程序分离到每个项目,但这是很多工作。 ListCollectionView 已经在为我做的工作。如果我需要付出那么多努力,我不妨完全跳过实时塑造,并在 ViewModel 中手动对我的列表进行排序。
  • @NathanFriend 不是CollectionChanged 应该做你想做的事吗?您是否尝试过处理该事件?
  • 我的ItemsSource 上没有调用CollectionChanged 回调,因为排序只发生在视图中。
  • @NathanFriend 你试过做这样的事情吗((ICollectionView)yourListCollectionView).CollectionChanged += handler;

标签: c# wpf treeview collectionviewsource listcollectionview


【解决方案1】:

我相信活动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.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多