2009-09-21 9 views
1

J'ai un TreeView, dans lequel j'utilise un HierarchicalDataTemplate. Avec cela, je colorie mes différents objets (tous du même type).WPF Masquer les éléments avec trigger dans treeview

Avec un clic sur un CheckBox dans la Page, je veux cacher certains des éléments (avec une certaine propriété). J'ai testé beaucoup de code, mais rien ne fonctionne correctement. Je cherche des réponses ...

Voici un échantillon de mon code:

public partial class Window1 : Window 
{ 
    public Window1() 
    { 
     InitializeComponent(); 

     TreeElements tRoot = new TreeElements("Root", false); 
     TreeElements t1 = new TreeElements("Node 1", false); 
     TreeElements t11 = new TreeElements("Node 1-1", true); 
     t1.Children.Add(t11); 
     TreeElements t12 = new TreeElements("Node 1-2", false); 
     t1.Children.Add(t12); 
     tRoot.Children.Add(t1); 
     TreeElements t2 = new TreeElements("Node 2", false); 
     TreeElements t21= new TreeElements("Node 2-1", false); 
     TreeElements t211 = new TreeElements("Node 2-1-1", false); 
     t21.Children.Add(t211); 
     t2.Children.Add(t21); 
     tRoot.Children.Add(t2); 
     trv.Items.Add(tRoot); 
    } 
} 

public class TreeElements 
{ 
    public string Description { get; set; } 
    public List<TreeElements> Children { get; set; } 

    public TreeElements(string description, bool error) 
    { 
     Description = description; 
     _error = error; 
     Children = new List<TreeElements>(); 
    } 

    private bool _error; 

    public bool Error 
    { 
     get 
     { 
      bool bValue = _error; 
      foreach (TreeElements child in Children) 
       bValue = bValue || child.Error; 
      return bValue; 
     } 
    } 
} 

Et le XAML:

<Window x:Class="WpfApplication2.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 

    <Window.Resources> 
     <HierarchicalDataTemplate x:Key="HDT_items" ItemsSource="{Binding Path=Children}"> 
      <TextBlock Text="{Binding Path=Description}" x:Name="txt" /> 
      <HierarchicalDataTemplate.Triggers> 
       <DataTrigger Binding="{Binding Path=Error}" Value="true"> 
        <Setter TargetName="txt" Property="Foreground" Value="Red" /> 
       </DataTrigger> 
      </HierarchicalDataTemplate.Triggers> 
     </HierarchicalDataTemplate>  
    </Window.Resources> 

    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="*" /> 
     </Grid.RowDefinitions> 

     <CheckBox x:Name="chk">Mask some items</CheckBox> 

     <TreeView Grid.Row="1" x:Name="trv" ItemTemplate="{StaticResource HDT_items}" /> 
    </Grid> 
</Window> 

je veux, quand la case est cochée, pour ne pas afficher les nœuds qui sont avec Error = false, mais sans changer la source de données. Est-ce possible et comment?

Répondre

0

Modifier le type de TreeElement.Children de List à ObservableCollecton. Et au lieu de masquer des éléments dans la vue, supprimez simplement tme de la collection sous-jacente dans le ViewModel.

+0

Oui, merci, cela fonctionne avec une fonction qui reconstruit la collection sous-jacente. – Gulix