2009-09-02 7 views
8

Jak mogę rozszerzyć cały TreeView w Silverlight?Rozwiń cały TreeView w Silverlight

EDIT: Tutaj jest XAML:

<controls:TreeView x:Name="tv"> 
    <controls:TreeView.ItemTemplate> 
     <common:HierarchicalDataTemplate ItemsSource="{Binding Children}"> 
      <CheckBox IsChecked="{Binding Visible, Mode=TwoWay}" Content="{Binding Name}"/> 
     </common:HierarchicalDataTemplate> 
    </controls:TreeView.ItemTemplate> 
</controls:TreeView> 

Może używając ItemTemplate sprawia, że ​​zwróci null ItemContainerGenerator.ContainerFromIndex na dowolnym indeksie?

Odpowiedz

9

Najpierw przeczytaj ten artykuł: http://bea.stollnitz.com/blog/?p=55

drugie, dziedziczyć TreeViewItem i TreeView:

public class TreeViewItemEx : TreeViewItem { 
    protected override DependencyObject GetContainerForItemOverride() { 
     TreeViewItemEx tvi = new TreeViewItemEx(); 
     Binding expandedBinding = new Binding("IsExpanded"); 
     expandedBinding.Mode = BindingMode.TwoWay; 
     tvi.SetBinding(TreeViewItemEx.IsExpandedProperty, expandedBinding); 
     return tvi; 
    } 
} 

public class TreeViewEx : TreeView { 
    protected override DependencyObject GetContainerForItemOverride() { 
     TreeViewItemEx tvi = new TreeViewItemEx(); 
     Binding expandedBinding = new Binding("IsExpanded"); 
     expandedBinding.Mode = BindingMode.TwoWay; 
     tvi.SetBinding(TreeViewItemEx.IsExpandedProperty, expandedBinding); 

     return tvi; 
    } 
} 

trzecie, właściwość wiązania swój model do "IsExpanded".

+1

Z perspektywy SL4 z 2011 r. musiałem stworzyć specjalizację, jak pokazano na rysunku.Jest już wiążąca, więc trzecia nie jest potrzebna, pierwsza dotyczy tylko wyjaśnienia. nie działa dla mnie i jest dostępny z wyjątkiem dotyczącym tylko do odczytu właściwości o nazwie ''. – flq

1

yourtreeview.ExpandAll()

EDIT: Martin wskazał, że metoda ExpandAll() nie istnieje dla TreeView, ale ja po prostu wpisać następujący kod w moim projekcie i Silverlight intellisense podniósł:

TreeView test = new TreeView(); 
      test.ExpandAll(); 

można również ustawić atrybut TreeView IsExpanded = „true” w XAML, choć nie jestem pewien, czy to rozwija całe drzewo lub tylko jeden poziom

+0

'ExpandAll' nie jest metodą na' TreeView' w Silverlight. –

+0

Mam na myśli kontrolkę Silverlight 3 "System.Windows.Controls.TreeView' w zestawie" System.Windows.Controls ".Ta klasa nie ma metody "ExpandAll". Po drobiazgowym zbadaniu odkryłem, że Toolkit Silverlight ma metodę rozszerzania 'ExpandAll' i prawdopodobnie jest to metoda, którą pobiera itellisense. –

+0

Rozwiń wszystko jest metodą rozszerzenia, ale nie robi nic, więc nie pomaga. Przepraszam :( –

4

będzie trzeba użyć TreeView.ItemContainerGenerator, aby uzyskać instancje TreeViewItem i ustawić na nich . Jest to nieco skomplikowane, ponieważ ekspansja odbywa się asynchronicznie. Można znaleźć przykłady kodu w Internecie lub po prostu użyć tej metody rozszerzenia:

public static class TreeViewExtensions { 

    public static void ExpandAll(this TreeView treeView) { 
    for (Int32 i = 0; i < treeView.Items.Count; ++i) { 
     TreeViewItem item = treeView.ItemContainerGenerator.ContainerFromIndex(i) as TreeViewItem; 
     if (item != null) 
     ExpandAll(item); 
    } 
    } 

    static void ExpandAll(TreeViewItem item) { 
    if (!item.IsExpanded) { 
     item.IsExpanded = true; 
     item.Dispatcher.BeginInvoke(() => ExpandAll(item)); 
    } 
    else { 
     for (Int32 i = 0; i < item.Items.Count; ++i) { 
     TreeViewItem childItem = item.ItemContainerGenerator.ContainerFromIndex(i) as TreeViewItem; 
     if (childItem != null) 
      ExpandAll(childItem); 
     } 
    } 
    } 
+0

Myślę, że to powinno działać (próbka). –

+0

Ciągle otrzymuję null na TreeView.ItemContainerGenerator.ContainerFromIndex na wszystkich indeksach .. nie rozumiem dlaczego ... –

0

nie widzę, że odpowiedź na pytanie, ponieważ TreeViewItem jest zawsze NULL:

TreeViewItem item = treeView.ItemContainerGenerator.ContainerFromIndex(i) as TreeViewItem; 
     if (item != null) 
     ExpandAll(item); 

połączeń UpdateLayout () na TreeView, zanim spróbujesz uzyskać TreeViewItem. To powinno pomóc!

+1

Jeśli 'TreeView' nie został załadowany ty nie można użyć 'ExpandAll', więc myślę, że wywołujesz metodę zbyt wcześnie Dodaj program obsługi dla zdarzenia' TreeView.Loaded' i wywołaj w tym miejscu 'ExpandAll' .Inną opcją jest oczywiście wywołanie' UpdateLayout', ale wolę inne Podejście: –

0

Jeśli chcesz zrobić w Xaml, można to zrobić za pomocą zestawu narzędziowego zestawu narzędzi Silverlight & ustawianie zasobów stylów. Kod jest dostępny tutaj: http://bea.stollnitz.com/blog/?p=54

3

TreeViewMenu.Dispatcher.BeginInvoke (() => TreeViewMenu.ExpandAll());

Po prostu dodaj tę linię po utworzeniu elementów widoku drzewa. to wszystko!

18

Wiem, że to trochę późno, ale okazało się to, gdy patrząc na odpowiedź i od tego czasu okazało się, że w Silverlight 4 można używać niejawny Skórki, aby to zrobić:

<Style TargetType="controls:TreeViewItem"> 
    <Setter Property="IsExpanded" Value="True" /> 
</Style> 

w Silverlight 5 będzie trzeba aby dodać ten kod do sekcji, aby to osiągnąć.

<Style TargetType="sdk:TreeViewItem"> 
    <Setter Property="IsExpanded" Value="True" /> 
</Style>