1

ListView やその他のコントロールが SelectedItems コレクションを処理する方法を模倣しようとしています。アイテムのコレクションを持つクラスがあり、各アイテムには Selected プロパティがあります。

Item が独自の Selected プロパティを変更でき、変更すると親クラスで SelectedItemsChanged イベントが発生し、SelectedItems コレクションが変更を反映するスマートな動作を模倣したいと考えています。

内部リストを含まない SelectedItemsCollection クラスを実装しようとしていますが、代わりにメインの項目リストの各項目の選択状態をチェックします。この方法では、常に更新してメイン リストと同期する必要はありません。

ListView.SelectedListViewItemCollection のメタデータを見ていましたが、次の宣言があります。

public class SelectedListViewItemCollection : IList, ICollection, IEnumerable

Add、Remove、RemoveAt などを実装していません。これは、IList インターフェイスの使用規則に反していませんか。それらを実装しないとコンパイルできません。これは、メタデータの作成方法に問題があるだけですか?

この機能をエミュレートするにはどうすればよいですか?

4

1 に答える 1

3

これらのメソッドは明示的に実装されています。
たとえば、ILspy を使用してクラスを逆アセンブルすると、Add()メソッドが次のように実装されていることがわかります。

int IList.Add(object value)
{
    throw new NotSupportedException();
}

したがって、たとえば、のインスタンスがSelectedItemsCollectionあり、メソッドを呼び出したい場合Add()は、オブジェクトを次のようにキャストする必要がありますIList

((IList)mySelectedItemsCollection).Add(...)

はい、Visual Studio でクラスのメタデータを見ると、明示的に実装されたメソッドは隠されています。

プロパティについてSelected...まあ、「トリック」は、各アイテムがListViewそれが属する への参照を持っていることです。Selectedプロパティが変更されると、アイテムは イベントSetSelectedState()を発生させる listView のメソッドを呼び出しますSelectedChanged

また、コンストラクターで参照SelectedItemsCollectionを渡して作成されます。このようにして、要素の列挙は、ネストされたクラスであるためListViewアクセス可能な ListView の内部メンバーで実際に実行されます。SelectedItemsCollection

于 2012-04-11T16:45:32.973 に答える