2009-09-02 5 views
8

Как я могу расширить весь TreeView в Silverlight?Развернуть все TreeView в Silverlight

EDIT: Вот 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> 

Возможно, с помощью ItemTemplate делает ItemContainerGenerator.ContainerFromIndex возвращение нуль на любой индекс?

ответ

9

Во-первых, прочитайте этот пост: http://bea.stollnitz.com/blog/?p=55

Во-вторых, наследуйте TreeViewItem и 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; 
    } 
} 

В-третьих, обязательным свойством вашей модели к "IsExpanded".

+1

С точки зрения SL4 2011 года, мне нужно было создать специализации, как показано. Он уже выполняет привязку, поэтому третий не нужен. Сначала это только для объяснения. Привязка к «IsExpanded» в неявном стиле не работает для меня и исключает исключение в отношении свойства только для чтения с именем «». – flq

1

yourtreeview.ExpandAll()

EDIT: Мартин показал, что метод ExpandAll() не существует для TreeView, однако, я только что ввели следующий код в моем Silverlight Project и IntelliSense взял:

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

Вы также можете установить TreeView атрибут IsExpanded = «истинный» в XAML, хотя я не уверен, что расширяет целое дерево или только один уровень

+0

'ExpandAll' не является методом' TreeView' в Silverlight. –

+0

Я имею в виду элемент управления Silverlight 3 'System.Windows.Controls.TreeView' в сборке' System.Windows.Controls'.Этот класс не имеет метода «ExpandAll». После небольшого исследования я обнаружил, что Silverlight Toolkit имеет метод расширения ExpandAll, и, вероятно, это метод itellisense подбирает. –

+0

Развернуть все это метод расширения, но он ничего не делает, поэтому он не помогает. Извините :( –

4

Вы должны будете использовать TreeView.ItemContainerGenerator, чтобы получить TreeViewItem экземпляров и установить IsExpanded на тех. Это немного сложно, так как расширение выполняется асинхронно. Вы можете найти образцы кода в Интернете или просто использовать этот метод расширения:

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

Я думаю, это должно сработать (образец). –

+0

Я продолжаю получать null на TreeView.ItemContainerGenerator.ContainerFromIndex по всем индексам .. не понимаю почему .. –

0

Я не вижу, что вопрос решается, так как TreeViewItem всегда NULL:

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

Вызов UpdateLayout () в TreeView, прежде чем пытаться получить TreeViewItem. Это должно помочь!

+1

Если «TreeView» не был загружен, не может использовать 'ExpandAll', поэтому, я думаю, вы слишком рано вызываете метод. Добавьте обработчик для события TreeView.Loaded и вызовите' ExpandAll'. Другой вариант - это, конечно, вызов 'UpdateLayout', но я предпочитаю другой подход. –

0

, если вы хотите сделать это в Xaml, это можно сделать с помощью комплекта инструментов для собраний silverlight &. код доступен здесь: http://bea.stollnitz.com/blog/?p=54

3

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

Просто добавьте эту строку после создания элементов дерева. вот все!

18

Я знаю, что это немного поздно, но я нашел это при поиске ответа и с тех пор обнаружил, что в Silverlight 4 вы можете использовать неявную тематизацию, чтобы сделать это:

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

В Silverlight 5 вы будете иметь чтобы добавить этот код в этот раздел.

<Style TargetType="sdk:TreeViewItem"> 
    <Setter Property="IsExpanded" Value="True" /> 
</Style> 
Смежные вопросы