2009-05-13 14 views
13

私は現在、カスタムListViewItemクラスを必要としている - のはMyListViewItemそれを呼びましょう。 Checkedプロパティが変更されたときには、各アイテムに関連付けられたいくつかの追加データが必要で、いくつかの操作を実行する必要があります。私はいくつかのことを試してみたが、現在は関連するコードは次のようになります。C#の継承とオーバーライド塩基特性

class MyListViewItem : ListViewItem { 
    new public bool Checked { 
     get { 
      return base.Checked; 
     } 
     set { 
      base.Checked = value; 
      // do some other things here based on value 
     } 
    } 
    public MyListViewItem(Object otherData) { 
     // ... 
    } 
} 

私がいる問題は、私はListViewコントロール内の項目のチェックボックスをクリックしたとき、私のセッターが呼び出されないということです。誰かが私が間違っていることを知っていますか?私は親リストビューのItemCheckedイベントを使用することができることを知っていますが、それははるかにクリーンなソリューションのようです。 (また、私は実際にコンストラクタにObjectを渡すわけではありませんが、その部分はここでは重要ではありません)。

+0

興味があれば、自分のデータとgetter/setterのCheckedプロパティとのやり取りをカスタムデータとして扱うことになりました。なぜ私はそれを前に考えなかったのか分かりません。 – jnylen

答えて

18

それは「新しい」キーワード原因働いていないだけで、「非表示」、それを上書きしません。

これは、あなたがMyListViewItemの型定義を介して参照されるオブジェクトのインスタンスにチェックを呼び出す場合あなたのコードを実行することを意味します。ただし、ListViewは、ListViewItemの型定義を介してこのオブジェクトを参照するため、「新しい」メソッドを呼び出すことはありません。

は "新しい" ないオーバーライドです。より良い解決策は、おそらくカスタムリストビューでコードを処理することです。本当に醜いわけではありません。

+0

これは、私が現在list_ItemCheckedハンドラでやっていることです。私はそれがカスタムListViewを保証するとは思わないので、私は私のカスタムアイテムデータで何かをしたいと思う前にbase.Checkedを見ます。ありがとう。 – jnylen

+0

[この件に関する記事](http://broadcast.oreilly.com/2009/10/understanding-c-using-virtual.html) – Amicable

8

newoverridebaseメンバー。同じ名前の新しいメソッドを宣言します。 VB.NETではShadowsと呼ばれています。

実際、newは、コンパイラの警告をオフにする以外何もしません。 overrideと宣言していないメンバー(baseメンバーがvirtualまたはoverrideの場合にのみこれを行うことができます)は、baseメンバーの継承ツリーとは完全に無関係です。

3

ListViewItemと仮定。 Checkedプロパティが仮想である、あなたはそれを上書きする必要があります。

public override bool Checked 
+0

これは仮想ではありません。私は他の何かをしなければならないと思う。ありがとう! – jnylen

1

ListViewItem.Checkedプロパティは仮想ではありません(MSDNドキュメントhereを参照)。このように、この動作をオーバーライドすることはできません。ビヘイビアを変更するには、イベントを使用するか、ListViewから派生させてListView.OnItemCheckedをオーバーライドする必要があります。代わりに、独自のカスタムのListViewItemを作成する

1

、なぜカスタムデータを含むように別々の種類を作成し、カスタムデータを参照して、それぞれのListViewItemのTagプロパティを割り当てていませんか?

これは私がしばらくの間使用してきた、それは非常によく動作パターンです。アイテムがチェックされているときのカスタムアクションは、リストビューで関連するイベントを処理するだけです。