2012-03-26 5 views
0

Ich versuche, das TreeViewItem zu erweitern, um eine Eigenschaft hinzuzufügen. Was es verkompliziert, ist, dass es eine "Items" -Eigenschaft hat, die eine Liste desselben Klassentyps ist. Das Hinzufügen einer Eigenschaft erfordert das Überschreiben der untergeordneten Eigenschaft, die ich nicht ausführen möchte. Hier ist das Original TreeViewItem:Wie fügt man der Klasse Eigenschaften ohne Überschreiben hinzu?

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

Wie füge ich MyProperty, ohne die „Items“ Eigenschaft außer Kraft setzen zu müssen. Mit der Eigenschaft "Objekte", die ich nicht neu erstellen möchte, passieren viele Dinge. Danke für jede Hilfe oder Beratung.

+0

Diese Frage ist nicht sehr klar. Wenn Sie eine Eigenschaft mit dem Namen 'MyProperty' hinzufügen, wird die vorhandene Eigenschaft 'Items' weder überschrieben noch ausgeblendet. Warum glaubst du, wirst du gezwungen sein, 'Items' zu übersteuern? – phoog

+0

Weil ich möchte, dass die Kinder von Items die neue MyProperty haben. Andernfalls wird nur die oberste übergeordnete Wurzel die Eigenschaft haben. – TruMan1

+0

Aha, ich verstehe es. Eine Antwort steht bevor. – phoog

Antwort

2

Wie von JaredPar vorgeschlagen, können Sie die Items-Eigenschaft mit einer new IList<MyExtendedTreeViewItem> Items-Eigenschaft ausblenden. Dies ersetzt nicht die Items-Eigenschaft der Basisklasse, daher müssen Sie sie synchronisieren. Sie können dies tun, indem Sie eine (privat oder intern) Klasse Umsetzung der Basisklasse Elemente Sammlung zu wickeln:

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; } 
    } 
} 

Und:

class MyExtendedTreeViewItem : TreeViewItem 
{ 
    private ItemsWrapper _items; 

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

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

Dies ist nicht ganz typsicher, weil jemand einen Verweis bekommen könnte zu der Basis Items-Eigenschaft, und fügen Sie dann eine TreeViewItem hinzu, und die Umwandlung in MyExtendedTreeViewItem würde eine Ausnahme auslösen.

+0

Es ist erstickt auf "set {_baseItems [index] = this". Es besagt, dass ItemsWrapper nicht in TreeViewItem konvertiert werden kann. Scheint so, als könnte ich niederwerfen, aber nicht oben. – TruMan1

+0

@ TruMan1 Das war unvorsichtig Tippen von meiner Seite. Es sollte "Wert" statt "dieses" sein. Ich habe den Beitrag bearbeitet. – phoog

3

Es klingt, als ob Sie die Items Eigenschaft durch eine ersetzen möchten, die eine sehr unterschiedliche Definition hat. Wenn ja, dann new verwendet

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

Im Allgemeinen mit new ist schlechte Praxis betrachtet. Es gibt spezielle Fälle, wo es notwendig/nützlich ist, aber im Allgemeinen ist es verpönt. Eine speziell benannte Eigenschaft ist oft ein schöner Mittelweg für diese Art von Verhalten

1

Sie eine Erweiterungsmethode und nicht eine Eigenschaft, wie folgt verwenden können:

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

Keine Notwendigkeit, irgendetwas außer Kraft setzen , und Sie "erweitern" Ihre TreeViewItem mit einer neuen Methode (n).

Hoffe, das hilft.

+0

eine Idee, wie man neue Werte auf dem Objekt "beharrt"? – TruMan1

+0

@ TruMan1: Wenn Sie für Persistansy gehen, sind 'Extension-Methoden' * nicht * der Weg zu gehen. Um klar zu sein, ist es möglich zu verwalten, aber es ist verdrahtet, imo. Es ist besser, ein 'TreeViewItem' zu überschreiben und Eigenschaften zu implementieren, die in diesem Fall benötigt werden. – Tigran

0

Entweder überschreiben Sie es und rufen base.Items oben/unten auf, oder Sie taggen Ihre Version mit dem Schlüsselwort "new", was bewirkt, dass Ihre Version der Methode nur verwendet wird, wenn der Aufrufer das Objekt explizit kennt Ihrer neuen Klassenart. Es hängt von Ihrem Bedarf ab, aber ersteres ist viel häufiger.

Verwandte Themen