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