niedziela, 23 grudnia 2012

70-511 Rozdział 7 - Binding - Hierarchical Data Templates

W tej części o szablonach dla danych hierarchicznych.

Hierarchical Data Templates
Wyświetlając hierarchiczne dane w kontrolkach takich jak TreeView czy Menu możemy użyć HierarchicalDataTemplate. Klasa ta posiada wszystkie właściwości znane z klasy DataTemplate oraz kilka dodatkowych właściwości:
  • ItemBindingGroup - wartość tej właściwości jest kopiowana do wszystkich podrzędnych elementów danego elementu 
  • ItemContainerStyle - ustawia styl dla każdego z elementów podrzędnych
  • ItemContainerStyleSelector - logika wybierania stylu dla elementów
  • ItemsSource - ścieżka do następnego poziomu elementów względem obecnego
  • ItemStringFormat - formatowanie tekstu
  • ItemTemplate - szablon elementu
  • ItemTemplateSelector - logika wybierania szablonu prezentacji
Dwa przykłady obrazujące w jaki sposób poradzić sobie z szablonami dla danych hierarchicznych (pełny kod źródłowy do pobrania z linka podanego poniżej):

Definicje klas dla przykładu z firmami:

Code:
    [Serializable]
    public class Company
    {
        public string Name { get; set;}

        public List<CompanyState> CompanyStates { get; set; }
    }

    [Serializable]
    public class CompanyState
    {
        public string Name { get; set; }

        public List<Unit> Units { get; set; }
    }

    public class Unit
    {
        public string Name { get; set; }

        public List<Department> Departments { get; set; }
    }

    public class Department
    {
        public string Name { get; set; }

        public List<Employee> Employees { get; set; }
    }

    public class Employee
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }


Definicje hierarchii:

Code:
<Window x:Class="HierarchicalDataTemplates.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:bindingDataTemplates="clr-namespace:Binding_DataTemplates;assembly=SampleDataProvider" Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <HierarchicalDataTemplate x:Key="TreeViewDataTemplate" ItemsSource="{Binding Friends}">
            <TextBlock Text="{Binding Name}"></TextBlock>
            <HierarchicalDataTemplate.ItemTemplate>
                <DataTemplate>
                    <Grid>
                        <StackPanel Orientation="Horizontal">
                            <TextBlock Text="{Binding FirstName}"/>
                            <TextBlock Text=" "></TextBlock>
                            <TextBlock Text="{Binding LastName}"/>
                        </StackPanel>
                    </Grid>
                </DataTemplate>
            </HierarchicalDataTemplate.ItemTemplate>
        </HierarchicalDataTemplate>

        <HierarchicalDataTemplate x:Key="CompanyDataTemplate" ItemsSource="{Binding CompanyStates}" DataType="{x:Type bindingDataTemplates:Company}">
            <TextBlock Text="{Binding Name}" />
            <HierarchicalDataTemplate.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding Units}">
                    <TextBlock Text="{Binding Name}" />
                    <HierarchicalDataTemplate.ItemTemplate>
                        <HierarchicalDataTemplate ItemsSource="{Binding Departments}">
                            <TextBlock Text="{Binding Name}" />
                            <HierarchicalDataTemplate.ItemTemplate>
                                <HierarchicalDataTemplate ItemsSource="{Binding Employees}">
                                    <TextBlock Text="{Binding Name}" />
                                    <HierarchicalDataTemplate.ItemTemplate>
                                        <DataTemplate>
                                            <StackPanel Orientation="Horizontal">
                                                <TextBlock Text="{Binding Id}" />
                                                <TextBlock Text=" "></TextBlock>
                                                <TextBlock Text="{Binding FirstName}" />
                                                <TextBlock Text=" " />
                                                <TextBlock Text="{Binding LastName}" />
                                            </StackPanel>
                                        </DataTemplate>
                                    </HierarchicalDataTemplate.ItemTemplate>
                                </HierarchicalDataTemplate>
                            </HierarchicalDataTemplate.ItemTemplate>
                        </HierarchicalDataTemplate>
                    </HierarchicalDataTemplate.ItemTemplate>
                </HierarchicalDataTemplate>
            </HierarchicalDataTemplate.ItemTemplate>
        </HierarchicalDataTemplate>
    </Window.Resources>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <TreeView ItemTemplate="{StaticResource TreeViewDataTemplate}" ItemsSource="{Binding StatesList}" Grid.Column="0" />
        <TreeView ItemTemplate="{StaticResource CompanyDataTemplate}" ItemsSource="{Binding Company}" Grid.Column="1" />
    </Grid>
</Window>

Efekt:



Cały kod aplikacji można pobrać z linku: http://sdrv.ms/ZCHejE

Brak komentarzy:

Prześlij komentarz