2009-04-05 7 views
5

ein Objekt zu speichern (zum Beispiel eine Instanz einer Klasse) in einem TreeViewItem, ich bin Speichern derzeit das Objekt in der TreeViewItem ‚s Header und dann das Überschreiben der ToString Methode dieser Klasse , damit es den richtigen Zeichenfolgenheader anzeigt; Ich werfe das Objekt dann während eines Events zurück.WPF: Korrekt ein Objekt in einem TreeViewItem Speichern


Ist dies der richtige Weg, um diese Art von Sache zu erreichen, oder gibt es einen besseren, geeigneteren Weg?

Antwort

7

Der „richtige“ Weg ist, um nur die object die TreeView hinzufügen ‚s (oder TreeViewItem‘ s) Items Sammlung und ein HierarchicalDataTemplate verwenden, um zu steuern, wie das Element wiedergegeben wird:

Person.cs:

public class Person 
{ 
    private readonly ICollection<Person> _children = new ObservableCollection<Person>(); 

    public string Name { get; set; } 

    public ICollection<Person> Children 
    { 
     get 
     { 
      return _children; 
     } 
    } 
} 

Window1.xaml.cs:

public Window1() 
{ 
    InitializeComponent(); 

    var people = new List<Person>(); 
    var kent = new Person() { Name = "Kent" }; 
    kent.Children.Add(new Person() { Name = "Tempany" }); 
    people.Add(kent); 
    _treeView.ItemsSource = people; 
} 

Window1.xaml:

<TreeView x:Name="_treeView"> 
    <TreeView.Resources> 
     <HierarchicalDataTemplate DataType="{x:Type local:Person}" ItemsSource="{Binding Children}"> 
      <TextBlock Text="{Binding Name}"/> 
     </HierarchicalDataTemplate> 
    </TreeView.Resources> 
</TreeView> 
+0

Danke für die Antwort. Wie implementiert man sozusagen ein "nested HierarchicalDataTemplate"? Zum Beispiel haben die Elemente in der ItemsSource-Bindung eine andere Liste in ihnen, und ich möchte, dass die Liste eine Unterliste von ihnen ist. –

+0

np Dreas. Können Sie als Antwort markieren und eine separate Frage zu den verschachtelten HierarchicalDataTemplates stellen? –

+0

Hallo Kent, werde ich tun. –

1

Die „Antwort“ oben in meiner Sicht die eigentliche Frage nicht beantwortet, und in der Tat zeigt die ursprüngliche Frage, dass die Frage Autor bereits eine sehr effiziente Lösung für die hatte Problem. Die angegebene "Antwort" zeigt jedoch lediglich, wie ein Unterobjekt an ein TreeViewItem angehängt und anschließend mit einer benutzerdefinierten Methode gerendert wird. Obwohl dies nützlich ist, befasst sich diese Antwort nicht mit der tatsächlichen Natur der ursprünglichen Frage.

Es gibt viele Szenarios, in denen ein TreeViewItem ein externes Objekt haben muss, das nicht in die Liste Elemente des TreeViewItem gehört. Dies erleichtert den Zugriff auf das angefügte externe Objekt für anwendungsspezifische Zwecke, wenn der Benutzer das TreeViewItem aus der TreeView auswählt. Dieses Konzept unterscheidet sich grundlegend von der Idee, einem TreeViewItem Unterobjekte hinzuzufügen.

Eine alternative Methode zur Lösung dieses Problems im Gegensatz zu der ursprünglich vom Autor der Frage implementierten Lösung besteht darin, die TreeViewItem-Klasse von Unterklassen zu trennen und benutzerdefinierte Informationen wie ein angehängtes Objekt hinzuzufügen. Dieses Prinzip wird in dem Artikel http://msdn.microsoft.com/en-us/library/1330h6a4.aspx veranschaulicht. Nach dem Implementieren dieser benutzerdefinierten TreeViewItem-Unterklasse kann diese Unterklasse der Items-Liste von TreeView oder TreeViewItem hinzugefügt werden. Wenn der Benutzer das Element aus der Strukturansicht auswählt, wird das Objekt, das von der Auswahl zurückgegeben wird, die benutzerdefinierte Unterklasse sein, die alle benutzerdefinierten Informationen enthält, die die Unterklasse definiert hat.

Ein zusätzlicher Vorteil der Verwendung einer benutzerdefinierten TreeViewItem-Unterklasse anstelle von TreeViewItem besteht darin, dass benutzerdefinierte Verhaltensweisen von der Unterklasse implementiert werden können. Um zum Beispiel eine benutzerdefinierte Tooltip angezeigt wird, wenn der Benutzer die Maus über das Element schwebt, kann die Unterklasse für sich ein Quick-Info-Objekt-Set mit Code wie:

ToolTip tip = new ToolTip() { Content = "Tooltip display value" }; 
ToolTipService.SetToolTip(this, tip); 
Verwandte Themen