2

基本クラスListView.ColumnHeaderCollection( にありますSystem.Windows.Forms) を拡張するクラスを作成しました。INotifyCollectionChanged を介してコレクションが変更されたときに通知を受信できるようにしたいと考えています。

これまでのところ、私は持っています:

public class MyCollection : ListView.ColumnHeaderCollection, INotifyCollectionChanged { ... }

私の初期化メソッドでは、デリゲートに独自のメソッドを割り当てていOnCollectionChanged()ます。

UserSettings.Instance.Columns.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(OnCollectionChanged);

興味のある方のために、私のデリゲートは次のようになります。

public void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
    Settings_Save();
}

そして、私たちは私の問題に到達します。が必要とするインターフェイス メンバの実装方法がわかりませんINotifyCollectionChanged

'_Namespace_.MyCollection' does not implement interface member 'System.Collections.Specialized.INotifyCollectionChanged.CollectionChanged'

この C# 初心者に感謝します。

4

1 に答える 1

4

に従って、実装クラスにあるためにINotifyCollectionChanged呼び出されるパブリック イベント メンバーが必要です。CollectionChangedすなわち:

public class MyCollection : INotifyCollectionChanged
{
    public event NotifyCollectionChangedEventHandler CollectionChanged;
    // ...
}

new編集:キーワードを使用して非仮想プロパティをオーバーライドします:

public class MyListView : ListView
{

    public new MyCollection Columns { get; set; }
    //...

}

ただし、注意が必要です。参照型が参照する場合、ListView.Columnsそれは異なるコレクションになりMyCollection.Columns、予期しない動作を引き起こします。基本プロパティをオーバーライドするために使用newする場合、基本プロパティを設定/取得する必要があります。これにより、コレクションの整合性が保持されます。つまり、次のようになります。

public class MyListView : ListView
{
    public new MyCollection Columns
    {
        get
        {
            return base.Columns as MyCollection;
        }
        set
        {
            base.Columns = value;
        }
    }
}
于 2013-10-29T22:13:29.033 に答える