2012-03-26 7 views
0

プロパティを追加するためにTreeViewItemを拡張しようとしています。複雑なことは、同じクラスタイプのリストである「Items」プロパティがあることです。プロパティを追加するには、私がしたくないchildrenプロパティをオーバーライドする必要があります。私は、「アイテム」プロパティをオーバーライドすることを余儀なくされることなく、MYPROPERTYを追加するにはどうすればよいオーバーライドしないでクラスにプロパティを追加するには?

public class TreeViewItem : NavigationItem<TreeViewItem>, INavigationItemContainer<TreeViewItem>, ITreeViewItem 
{ 
    public IList<TreeViewItem> Items { get; } 
} 

:ここではオリジナルのツリービューアイテムです。私が再作成したくない「Items」プロパティでは、多くのことが起こります。助けやアドバイスありがとう。

+0

この質問はあまり明確ではありません。 'MyProperty'という名前のプロパティを追加すると、既存の' Items'プロパティをオーバーライドしたり隠したりすることはありません。なぜあなたは 'Items'をオーバーライドする必要があると思いますか? – phoog

+0

アイテムの子に新しいMyPropertyを持たせたいからです。それ以外の場合は、最上位のルート親だけがそのプロパティを持ちます。 – TruMan1

+0

ああ、私はそれを手に入れます。答えが出てくる。 – phoog

答えて

2

JaredParが提案したように、Itemsプロパティをnew IList<MyExtendedTreeViewItem> Itemsプロパティで非表示にすることができます。これは基本クラスのItemsプロパティを置き換えるものではないため、それらを同期させる必要があります。誰かが参照を取得する可能性があるため、

class MyExtendedTreeViewItem : TreeViewItem 
{ 
    private ItemsWrapper _items; 

    public MyExtendedTreeViewItem() 
    { 
     _items = new ItemsWrapper(base.Items); 
    } 

    public new IList<MyExtendedTreeViewItem> Items { get { return _items; } } 
} 

これは完全にタイプセーフではありません。

class ItemsWrapper : IList<MyExtendedTreeViewItem> 
{ 
    private IList<TreeViewItem> _baseItems; 

    public ItemsWrapper(IList<TreeViewItem> baseItems) 
    { 
     _baseItems = baseItems; 
    } 

    public void Add(MyExtendedTreeViewItem item) 
    { 
     _baseItems.Add(item); 
    } 

    // much of implementation omitted here for brevity 

    public MyExtendedTreeViewItem this[int index] 
    { 
     get { return (MyExtendedTreeViewItem)_baseItems[index]; } 
     set { _baseItems[index] = value; } 
    } 
} 

そして:あなたは、基本クラスのアイテムのコレクションをラップする(プライベートまたは内部)クラスを実装することによってこれを行うことができます基底のItemsプロパティに追加し、次にTreeViewItemを追加し、MyExtendedTreeViewItemへのキャストは例外をスローします。

+0

これは "set {_baseItems [index] = this"]で窒息しています。 ItemsWrapperをTreeViewItemに変換することはできません。私はキャストダウンができないように見える。 – TruMan1

+0

@ TruMan1それは私の部分に不注意な入力でした。 'this'ではなく' value'でなければなりません。私は投稿を編集しました。 – phoog

3

Itemsプロパティを非常に異なる定義を持つものに置き換えているように思えます。そうならば、newを使用して一般的にnew

public class MyItem : TreeViewItem { 
    public new List<SomethingElse> Items { 
    get { ... } 
    } 
} 

を使用することは悪い習慣と考えられています。それが必要である/有用である特定のケースがありますが、一般的にそれは眉をひそめます。

public static class TreeViewItemExtensions 
{ 
    public static object GetPropertyValue(this TreeViewItem tvi) 
    { 
    } 
} 

何かを上書きする必要はありません。より具体的に指定されたプロパティは、多くの場合、このようなあなたは拡張メソッドないプロパティを使用することができます行動

1

このタイプのナイスミドルアースであり、新しい方法でTreeViewItemを「拡張」することができます。

これが役に立ちます。私はあなたが拡張メソッドと同様に作成するべきだと思い

+0

オブジェクトに新しい値を "永続化"する方法はありますか? – TruMan1

+0

@ TruMan1:あなたが辛口のために行くなら、 '拡張メソッド'は行く方法ではありません。はっきりとは管理することが可能ですが、それは結構です。 'TreeViewItem'をオーバーライドし、その場合に必要なプロパティを実装する方が良いでしょう。 – Tigran

0

これをオーバーライドして、top/bottomのbase.Itemsを呼び出すか、キーワード "new"でバージョンをタグ付けします。これにより、呼び出し元が明示的にオブジェクトを認識している場合にのみメソッドのバージョンが使用されます。あなたの新しいクラスタイプの あなたの必要に応じて異なりますが、前者ははるかに一般的です。