1

私は、カスタムとライブシェーピングをTreeView使用して子を注文する を持っています。現在選択されている がビューで再ソートされたときに、の新しい位置に自動的にスクロールしたいと思います。ただし、 が新しい並べ替えを適用したときに通知を受ける方法が見つからず、必要な動作が に組み込まれていないようです。ListCollectionViewIComprarerTreeViewItemTreeViewTreeViewItemListCollectionViewTreeViewControl

ListCollectionViewがソート順を再計算したときに通知を受ける方法はありますか?

4

1 に答える 1

6

イベントCollectionChangedは必要なものだと思います。次のようなことができます。

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

ここでキャストする必要がある理由は、 (はこのインターフェイスから継承)CollectionChangedのメンバーとして実装されているためです。ソース コードは次のとおりです。INotifyPropertyChangedICollectionView

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

この実装は明示的です。そのため、イベントはパブリック メンバーとして通常のアクセスから隠されています。そのメンバーを公開するには、インスタンスをICollectionViewまたはにキャストできますINotifyPropertyChanged

. インターフェイスを明示的に実装する場合、インターフェイス メンバーにアクセスする前に、インスタンスをそのインターフェイスに明示的にキャストする必要があります。

インターフェイスの実装に関する例:

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.
于 2014-09-26T20:10:18.213 に答える