2010-01-30 9 views
15

Powiedzmy, że mam drzewo binarne, w którym głównym elementem struktury danych jest tylko węzeł drzewa. Dla każdego węzła dzieci są dostępne za pośrednictwem właściwości Children. Oto, co próbowałem. Wartość TreeRoot jest własnością dziedziczonego kontekstu danych, ale jest to pojedynczy węzeł (nie zbiór).Czy mogę powiązać drzewo widoku drzewa WPF z pojedynczym węzłem głównym?

<UserControl.Resources> 
    <HierarchicalDataTemplate x:Key="TreeNodeTemplate" ItemsSource="{Binding Children}"> 
     <TextBlock Text="{Binding Name}" /> 
    </HierarchicalDataTemplate> 
</UserControl.Resources> 

<Grid> 
    <TreeView ItemsSource="{Binding TreeRoot}" ItemTemplate="{StaticResource TreeNodeTemplate}" /> 
</Grid> 
+0

Czy któraś z poniższych odpowiedzi rozwiązała Twój problem, Sam? Jeśli tak, czy mógłbyś zaakceptować odpowiedź, która najlepiej rozwiązałaby Twój problem? Jeśli nie, czy możesz podać dalsze informacje na temat tego, czego brakuje? Dziękuję Ci! –

Odpowiedz

4

Myślę, że problemem jest to, że hierarchiczna szablon danych jest stosowana tylko do węzła głównego, więc nigdy nie widać nic w przeszłości dzieci na root. Spróbuj zamiast tego:

<UserControl.Resources> 
    <HierarchicalDataTemplate DataType="{x:Type TreeNode}" ItemsSource="{Binding Children}"> 
     <TextBlock Text="{Binding Name}" /> 
    </HierarchicalDataTemplate> 
</UserControl.Resources> 

<Grid> 
    <TreeView ItemsSource="{Binding TreeRoot}"/> 
</Grid> 

Gdzie TreeNode jest nazwą klasy węzła drzewa.

2

Tak jak powiedział Aviad, jeśli użyjesz DataType="{x:Type TreeNode}", to TreeView automatycznie użyje tego szablonu dla dowolnego obiektu tego typu.

Jeśli w hierarchii znajduje się wiele typów, można określić wiele HierarchicalDataTemplates, każdy z typem danych, dla którego jest przeznaczony. To pozwoliłoby TreeView obsługiwać każdy typ inaczej.

<HierarchicalDataTemplate DataType="{x:Type TreeNode}" ItemsSource="{Binding Children}"> 
    <TextBlock Text="{Binding Name}" /> 
</HierarchicalDataTemplate> 

<HierarchicalDataTemplate DataType="{x:Type TreeLeaf}"> 
    <TextBlock Text="{Binding Message}" Background="Red" /> 
</HierarchicalDataTemplate> 
9

miałem ten problem i stwierdził, że nie mogę powiązać niepobieranie do katalogów jako sposób określenia węzła głównego. Zrobiłem więc szybką zmianę w moim ModelView i uczynienie właściwości reprezentującej węzeł główny kolekcją 1 elementu.

public class ContainerViewModel 
{ 
    public ObservableCollection<TreeNodeViewModel> RootNodes { get; private set; } 

    public ContainerViewModel() 
    { 
     // Create a single node in the collection of root nodes 
     RootNodes = new ObservableCollection<TreeNodeViewModel>(); 
     RootNodes.Add(new TreeNodeViewModel()); 
    } 
} 

public class TreeNodeViewModel 
{ 
    public ObservableCollection<TreeNodeViewModel> Children { get; set; } 
} 

Użyłem ObservableCollection <> powyżej, ale może więcej sensu używać coś tańszego jak lista <> Ponieważ nie spodziewasz kolekcja zmienić (przynajmniej w swoim scenariuszu).

Powiązane problemy