ObservableCollection (int .NET 3.5) は、PropertyChanged イベントを興味深い方法で実装しているようです。
protected event PropertyChangedEventHandler PropertyChanged;
event PropertyChangedEventHandler INotifyPropertyChanged.PropertyChanged;
これは、保護されたPropertyChangedイベントが内部実装にのみ使用される可能性が高いことを意味します。もう1 つのINotifyPropertyChanged.PropertyChangedイベントは、明示的なインターフェイスとしてINotifyPropertyChangedインターフェイスの実装を実際に実行するイベントです。奇妙なことに、ObservableCollection 内にINotifyPropertyChanged.PropertyChangedが実際に発生する場所がありません。これは、これが .NET 3.5 のバグであることを示している可能性がありますが、たとえば、項目がコレクションに追加されたときに Count のプロパティ変更イベントが発生するかどうかを確認するためにテストしていませんが、それがどのように機能するかを示しています.
.NET 4.0 の実装では、INotifyPropertyChanged.PropertyChangedイベントが、保護されたPropertyChangedイベントによって使用される同じプライベート デリゲートにフックされているように見えますが、これはバグ修正である可能性があります。これは、自動イベントの実装が .NET 4.0 で処理される方法の違いが原因である可能性もあります。
訂正: INotifyPropertyChanged.PropertyChangedイベントが ObservableCollection によって発生することを確認したので、Reflector を使用して ObservableCollection の実装を調べた結果に基づいて上記で行った仮定は不正確でなければなりません。私の推測では、リフレクターが何か奇妙なバグを起こしているのではないかと思います。その証拠はまだありません。
したがって、例を機能させるには、これが機能するように記述する必要があります。Will が回答で示したように、以下の例のようになります。
SelectableList<int> intList = new SelectableList<int>();
((INotifyPropertyChanged)intList).PropertyChanged +=
new PropertyChangedEventHandler(intList_Changed);
面白いですよね?明示的なインターフェイスの使用は、主に、特定のインターフェイスに必要なメンバーで避けられない衝突を回避するために使用されますが、ある意味でメンバーの存在を隠すために使用できます。
サブクラスに導入する独自のカスタム プロパティのプロパティ変更イベントを発生させたい場合は、ObservableCollection も実装する保護されたOnPropertyChangedメソッドをオーバーライドおよび/または呼び出すことを検討してください。この手法はよく採用されている標準であり、サブクラスは、基になるイベント デリゲートにアクセスせずにイベントを発生させたり、イベントを処理したりできます。ちなみに、一般的には、サブクラスがイベント ハンドラーを独自の基本クラス イベントにフックする代わりに、この手法も使用することをお勧めします。その他の例については、さまざまなコントロールのイベントが WinForms と WPF でどのように実装されているかを見てください。