WPF: TreeView Control XAML HierachicalDataTemplate!
-
btw:
setz mal breakpoints in die ctors - nicht das der zweite ctor erst spaeter aufgerufen wird und dadurch deine children ueberschrieben werden
public MyTreeNode(string name,IEnumerable<MyTreeNode> child) :this(name) { _children = new List<MyTreeNode>(child); } public MyTreeNode(string name) { _children = new List<MyTreeNode>(); Name = name; }
was mir noch einfallen wuerde - pack mal das root element in eine liste
also
public ObservableCollection<MyTreeNode> Root { get; set; }
Root.Add(new ...);
-
Das wars Problem:
public ObservableCollection<MyTreeNode> Root { get; set; }
Root.Add(new ...);ist aber blöd weil Root nun mal nur ein object ist.. aber der TreeView kann wohl mehrer Ursprünge haben;)
Danke Mr. Evil;)
-
Da hab ich aber grad noch ne frage:)
ich will nun in jedes TreeView item, da wo der Textblock is noch einen button rein machen.. der soll aber NUR dann angezeigt werden wenn der Knoten Selektiert ist.. d.h. es soll dann nur der button von einem Knoten im Tree angezeigt werden!
-
NullBockException schrieb:
ist aber blöd weil Root nun mal nur ein object ist.. aber der TreeView kann wohl mehrer Ursprünge haben
genau
denn die ersten elemente im tree haben ja keinen parent mehr - entsprechend kommen die aus einer listewas selektionen im tree an geht - ich hatte da man irgendwo was gelesen wo ich auch experimente gestartet hatte - ich such mal
-
schau mal hier:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-238330-and-postdays-is-0-and-postorder-is-asc-and-highlight-is-treeview-and-start-is-10.htmldas waere zb ne moeglichkeit:
<Style TargetType="{x:Type TreeViewItem}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="TreeViewItem"> <StackPanel Margin="10,2,0,0"> <WrapPanel Name="item"> <ToggleButton Name="expander" IsChecked="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IsExpanded}" Content="+"/> <Button Content="..." x:Name="button" Visibility="Collapsed" /> <TextBlock Text="{Binding Name}" /> </WrapPanel> <Border> <ItemsPresenter Name="children" Visibility="Collapsed" /> </Border> </StackPanel> <ControlTemplate.Triggers> <Trigger Property="IsSelected" Value="True"> <Setter TargetName="button" Property="Visibility" Value="Visible"/> </Trigger> <Trigger Property="IsExpanded" Value="True"> <Setter TargetName="children" Property="Visibility" Value="Visible"/> </Trigger> <Trigger Property="HasItems" Value="False"> <Setter TargetName="expander" Property="Visibility" Value="Collapsed"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style>
den expander musst du dann leider wieder selber zeichnen - steht auch in dem thread
-
Ohhh.. das sieht ja höllisch komplizier aus, auch nach mehrmalligen anschaun hab ich da bischen verständis probleme!
Wo muss ich den diesen xaml code jinkopieren? direkt in das TReeviewitem ? oder extra?
-
So ich habdas man nach reiner Intension eignebaut. und es funktioniert auch;) Aber ich würdes auch bischen verstehen wollen..
<Style TargetType="{x:Type TreeViewItem}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="TreeViewItem"> .... </ControlTemplate> </Setter.Value> </Setter> </Style>
Dieser Teil hab ich so einigermaßen verstanden.. staddest da ich den inhalt u. ausehen einer Baumknotens direkt im "HierachicalDataTemplate" definiere, wird über den Style die inhalteigenschaft "Template" des TreeViewItems defniert bzw. überschrieben?? Aber den ganzen rest mit Wrappanel und so versteh ich net ganz!!
-
ueberschrieben ja
normalerweise ist es so das lokale template definitionen gewichtiger sind als styles - nur durch das HierachicalDataTemplate hat man keine TreeViewItems wo man das template definieren koennte - drum ist der normale weg das man ein style definiert um die TreeViewItems zu manipulierenerst zur laufzeit wird das HierachicalDataTemplate aufgeloest zu richtigen TreeViewItems
und durch ein globalen style fuer TreeViewItem beeinflusst man alle diese elemente in dem sichtbarkeits bereich des styles
wenn man dann das Template definiert nimmt man dem TreeViewItem jegliches aussehen sodass man alles selber machen kann bzw muss
wenn du zb im style nur ein textblock machst wirst du feststellen das es sich noch genauso verhaellt - zb bei doppelklick auf und zu klappen - aber man sieht keine expander mehr (die pfeile in vista oder die +/- in xp) wo man nodes auf und zu klappt
da kommt dann das wrappanel ins spiel
dem gibt man dann ein toggle button was diesen expander darstellt (man muss den toggle butten nur wieder komplett selber stylen)
dann dein gewuenschten button daneben und dann ein textblock mit einem binding zu Name
(man koennte auch ein horizontalen stackpanel nehmen, spielt keine rolle)im trigger werden diese elemente dann entsprechend beeinflusst
-
Wie kann man denn auf das WrapPanel vom C# Code aus Zugreifen?
-
gar nicht - sowas macht man nicht
wozu auch, man hat doch schon alle items im code - die treeview zeigt nur an - darauf zu greifen ist doch schon sehr forms / mfc altbacken//typo
-
Ok aber wie kann man dann in einer treeview einen explorer realisieren, bei dem die folders ein image und die dateien (blätter) dann anstatt eines images ein eigenes steuerelement bekommen?
-
man erstellt sich ein
Folder bzw File objekt (oder gemeinsam eines)
diese haben die entsprechenden propertiespublic class FileFolderItem { public BitmapImage Icon { get; set; } public string Name { get; set; } /* ... */ public Collection<FileFolderItem> Childs { get; set; } }
im code hatt man dann den Tree
public class Bla { public Collection<FileFolderItem> Items { get; set; } }
und in der xaml bindet man entsprechend
<Style TargetType="{x:Type TreeViewItem}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="TreeViewItem"> <StackPanel Margin="10,2,0,0"> <WrapPanel Name="item"> <ToggleButton Name="expander" IsChecked="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IsExpanded}" Content="+"/> <Image Source="{Binding Icon}" /> <TextBlock Text="{Binding Name}" /> </WrapPanel> <Border> <ItemsPresenter Name="children" Visibility="Collapsed" /> </Border> </StackPanel> <ControlTemplate.Triggers> <Trigger Property="IsExpanded" Value="True"> <Setter TargetName="children" Property="Visibility" Value="Visible"/> </Trigger> <Trigger Property="HasItems" Value="False"> <Setter TargetName="expander" Property="Visibility" Value="Collapsed"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style>
<TreeView ItemsSource="{Binding Items}"> <TreeView.ItemTemplate> <HierarchicalDataTemplate ItemsSource="{Binding Childs}" /> </TreeView.ItemTemplate> </TreeView>
// der code ist nur pseudo
-
Jo hatt gut funktioniert thx