2013-04-23 5 views
0

им с помощью WPF/MVVM пошалить с управлением TreeViewОтключить TreeView корневого узла при использовании HierarchicalDataTemplate

<TreeView HorizontalAlignment="Left" 
        Height="319" 
        VerticalAlignment="Top" 
        Width="517" 
        ItemsSource="{Binding Tree}" 
        > 
      <TreeView.ItemTemplate> 
       <HierarchicalDataTemplate ItemsSource="{Binding Children}"> 
        <StackPanel Orientation="Horizontal"> 
         <Button Width="100" Height="20" IsEnabled="{Binding IsEnabled}" Content="{Binding Name}" /> 
        </StackPanel> 
       </HierarchicalDataTemplate> 
      </TreeView.ItemTemplate> 
     </TreeView> 

И это мой ViewModel с классом узла

public partial class MainWindow : Window 
    { 
     class TreeNode 
     { 
      public string Name { get; set; } 
      public bool IsEnabled { get; set; } 
      public List<TreeNode> Children { get; set; } 
      public TreeNode() 
      { 
       Children = new List<TreeNode>(); 
       IsEnabled = true; 
      } 
     } 

     class ViewModel 
     { 
      public List<TreeNode> Tree { get; private set; } 
      public ViewModel() 
      { 
       Tree = new List<TreeNode>(); 
      } 
     } 

     public MainWindow() 
     { 
      InitializeComponent(); 

      var viewModel = new ViewModel 
       { 
        Tree = 
         { 
          new TreeNode 
           { 
            Name = "Root 1", 
            IsEnabled = false, 
            Children = { 
             new TreeNode { Name = "Child 1" }, 
             new TreeNode { Name = "Child 2" }, 
             new TreeNode { Name = "Child 3", 
              Children = 
               { 
                new TreeNode { Name = "Child 3-1" }, 
                new TreeNode { Name = "Child 3-2" }, 
                new TreeNode { Name = "Child 3-3" }, 
               } 
             }, 
            } 
           } 
         } 
       }; 

      DataContext = viewModel; 
     } 
    } 

Как вы можете видеть, Я привязываю свойство «IsEnabled» к кнопке, все это хорошо, но я действительно хочу привязать свойство IsEnabled к фактическому элементу корневого узла, а не к объекту внутри узла.

Что мне нужно сделать, чтобы отключить весь корневой узел на основе этого значения свойства?

ответ

0

Для этого вам необходимо направить ItemContainerStyle на номер TreeView. Это устанавливает стиль для ItemContainer (TreeViewItem), который создается для каждого узла Дерева.

<TreeView HorizontalAlignment="Left" Height="319" VerticalAlignment="Top" Width="517" ItemsSource="{Binding Tree}"> 
    <TreeView.ItemTemplate> 
     <!-- Leave this the same, except for the IsEnabled binding on the button --> 
    </TreeView.ItemTemplate> 
    <TreeView.ItemContainerStyle> 
     <Style TargetType="{x:Type TreeViewItem}"> 
      <Setter Property="IsEnabled" Value="{Binding IsEnabled}"/> 
     </Style> 
    </TreeView.ItemContainerStyle> 
</TreeView> 
+0

Спасибо! Я лаял это дерево, но реализовал его не так, спасибо за то, что показал мне правильный способ сделать это :) – Swift

+0

Без проблем, рад помочь. Я часто путаюсь между «ItemTemplates» и «ItemContainerStyles» и который используется для чего! Иногда быстрое напоминание - это все, что требуется. –

Смежные вопросы