Комплекс Silverlight TreeView, възможна ли е вложена йерархия?

Имам DB, която изглежда така:

Locations         [rootlevel]
   Inspections    [level1]
   Areas          [level1]
      Inspections [level2]

Така че всяко местоположение може да има нула или повече инспекции и нула или повече зони, а зоните имат нула или повече инспекции. Всички записи за инспекции имат LocationID!=null и AreaID=null или !=null, за да получите тази йерархия.

Бих искал да получа всички имена на всеки елемент в таблицата в дървовиден изглед като навигация. Засега мога да получа И двете

Местоположения-->Области-->Инспекции ИЛИ

Локации-->Огледи

Не мога да накарам йерархията на дървовидния изглед да покаже това, от което се нуждая. Възможно ли е? Опитах се да използвам вложен дървовиден изглед като елемент в йерархията, за да покажа това, което искам, но не работи правилно.

xaml код за местоположения-->зони-->инспекции

 <!--NAVIGATION TREE HIERARCHICAL TEMPLATE-->
    <common:HierarchicalDataTemplate x:Key="AssetManager" ItemsSource="{Binding Path=Areas}">

        <!--START OF AREA OPTIONS TEMPLATE-->
        <common:HierarchicalDataTemplate.ItemTemplate>
            <common:HierarchicalDataTemplate ItemsSource="{Binding Path=Inspections}">

                <!--START OF INSPECTION OPTIONS TEMPLATE-->
                <common:HierarchicalDataTemplate.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <Image Source="Assets/Resources/ImageResources/SearchICON2.png" Height="20" Width="20" />
                            <TextBlock Margin="0,0,0,0" Text="{Binding Path=Name}"/>
                        </StackPanel>
                    </DataTemplate>
                </common:HierarchicalDataTemplate.ItemTemplate>
                <!--END OF INSPECTION OPTIONS TEMPLATE-->

                <StackPanel Orientation="Horizontal">
                    <Image Source="Assets/Resources/ImageResources/ManufacturingICON.png" Width="20" Height="20"/>
                    <TextBlock Margin="0,0,0,0" Text="{Binding Path=Name}"/>
                </StackPanel>
            </common:HierarchicalDataTemplate>
        </common:HierarchicalDataTemplate.ItemTemplate>
        <!--END OF AREA OPTIONS TEMPLATE-->


            <StackPanel Orientation="Horizontal">
                    <Image Source="Assets/Resources/ImageResources/ManufacturingICON.png" Width="20" Height="20"/>
                    <TextBlock Margin="0,0,0,0" Text="{Binding Path=Name}"/>                    
          </StackPanel>     
    </common:HierarchicalDataTemplate>
    <!--END OF NAVIGATION TEMPLATE-->

xaml за местоположения-->инспекции

 <!--NAVIGATION TREE HIERARCHICAL TEMPLATE-->
    <common:HierarchicalDataTemplate x:Key="AssetManager" ItemsSource="{Binding Path=Inspections}">
            <StackPanel Orientation="Horizontal">
                    <Image Source="Assets/Resources/ImageResources/ManufacturingICON.png" Width="20" Height="20"/>
                    <TextBlock Margin="0,0,0,0" Text="{Binding Path=Name}"/>
                </StackPanel>
            </common:HierarchicalDataTemplate>
        </common:HierarchicalDataTemplate.ItemTemplate>
        <!--END OF TEMPLATE-->

xaml за вложен дървовиден изглед

 <!--NAVIGATION TREE HIERARCHICAL TEMPLATE-->
    <common:HierarchicalDataTemplate x:Key="AssetManager" ItemsSource="{Binding Path=Areas}">

        <!--START OF AREA OPTIONS TEMPLATE-->
        <common:HierarchicalDataTemplate.ItemTemplate>
            <common:HierarchicalDataTemplate ItemsSource="{Binding Path=Inspections}">

                <!--START OF INSPECTION OPTIONS TEMPLATE-->
                <common:HierarchicalDataTemplate.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <Image Source="Assets/Resources/ImageResources/SearchICON2.png" Height="20" Width="20" />
                            <TextBlock Margin="0,0,0,0" Text="{Binding Path=Name}"/>
                        </StackPanel>
                    </DataTemplate>
                </common:HierarchicalDataTemplate.ItemTemplate>
                <!--END OF INSPECTION OPTIONS TEMPLATE-->

                <StackPanel Orientation="Horizontal">
                    <Image Source="Assets/Resources/ImageResources/ManufacturingICON.png" Width="20" Height="20"/>
                    <TextBlock Margin="0,0,0,0" Text="{Binding Path=Name}"/>
                </StackPanel>
            </common:HierarchicalDataTemplate>
        </common:HierarchicalDataTemplate.ItemTemplate>
        <!--END OF AREA OPTIONS TEMPLATE-->

        <StackPanel Orientation="Vertical">                         
                            <StackPanel Orientation="Horizontal">
                    <Image Source="Assets/Resources/ImageResources/ManufacturingICON.png" Width="20" Height="20"/>
                    <TextBlock Margin="0,0,0,0" Text="{Binding Path=Name}"/>                    
                </StackPanel>
                            <sdk:TreeView HorizontalAlignment="Left" ItemsSource="{Binding Source={StaticResource locationInspectionsViewSource}}" Name="inspectionsTreeView" VerticalAlignment="Top" ItemTemplate="{StaticResource Level2}" BorderBrush="{x:Null}" Background="{x:Null}"/>                                         
                    </StackPanel>
    </common:HierarchicalDataTemplate>
    <!--END OF NAVIGATION TEMPLATE-->

Благодаря ти


person xhedgepigx    schedule 08.05.2012    source източник


Отговори (1)


След много проучвания, скубане на коси и намеса в главата открих, че:

Не, не е възможно, когато използвате HierarchicalDataTemplate, за показване на вложена йерархия TreeView. Шаблонът за данни позволява само едно „дете“ на възел.

Едно решение е да обедините двата елемента от списъка „дете“ в един списък „дете“ и да го използвате в йерархията. Така че в моя случай местоположенията ще се отнасят до една таблица „дете“, където обектите Areas и Inspections са съседни, като всяка област се отнася до съответните деца на Inspection и инспекциите нямат деца.

Второ решение е да използвате вложен DataGrid. Това изглежда като измама, но постигна желания ефект. Шаблоните ще трябва да бъдат променени за DataGrid, така че да няма заглавки на колони/алтернативно оцветяване на редове/маркиране и т.н. В зависимост от това как трябва да изглежда TreeView.

Вторият всъщност е по-лесният вариант, тъй като използва стандартния DomainDataSource за главната таблица (с всички включвания), което позволява лесно капсулиране на DataContext, това също означава, че все още няма код отзад, който да гарантира, че оформлението е отделно.

Може да има повече начини, но намерих решение, което работи за мен и е лесно.

person xhedgepigx    schedule 16.05.2012
comment
Сега внедрявам първото решение, тъй като изискванията ми са се променили донякъде и сега първото решение е по-приложимо за моите нужди. Помага с персонализирани списъци и оформления, както и с отложено зареждане, което е полезно, ако йерархията е огромна. - person xhedgepigx; 23.08.2012