OrgChart for WPF and Silverlight | ComponentOne
C1OrgChart Task-Based Help / Using a Hierarchical Data Template
In This Topic
    Using a Hierarchical Data Template
    In This Topic

    This topic will demonstrate advanced binding scenarios using the DataTemplateSelector and HierarchicalDataTemplate classes.

    1. From the Visual Studio File menu select New and choose Project.
    2. In the New Project dialog box choose a language in the left-side menu, choose .NET 6.0 in the Framework drop-down list, and enter OrgChart as a name for the project.
    3. In the Solution Explorer, right-click the project name and choose Add Reference. In the Add Reference dialog box, locate and select the following assemblies and click OK to add references to your project:
      • C1.Silverlight
      • C1.Silverlight.OrgChart
    4. Add the xmlns:c1="http://schemas.componentone.com/winfx/2006/xaml" namespace to your namespace declarations in the <Window> tag. This is a more general namespace that will work with most of the WPF Edition controls.
    5. Add the following XAML markup below the namespace declarations to create the Data Templates:

      XAML
      Copy Code
      <UserControl.Resources>
              <!-- template for Team objects -->
              <DataTemplate x:Key="TeamTemplate" >
                  <Border Background="LightBlue" Padding="4" >
                      <TextBlock FontStyle="Italic" Text="{Binding Path=Name}" />
                  </Border>
              </DataTemplate>
              <!-- template for Division objects -->
              <sdk:HierarchicalDataTemplate x:Key="DivisionTemplate"
                  ItemsSource="{Binding Path=Teams}"
                  ItemTemplate="{StaticResource TeamTemplate}">
                  <Border Background="Gold" >
                      <TextBlock Text="{Binding Path=Name}" FontWeight="Bold" HorizontalAlignment="Center" VerticalAlignment="Center" Padding="20" />
                  </Border>
              </sdk:HierarchicalDataTemplate>
              <!-- template for League objects -->
              <sdk:HierarchicalDataTemplate x:Key="LeagueTemplate"
                  ItemsSource="{Binding Path=Divisions}"
                  ItemTemplate="{StaticResource DivisionTemplate}">
                  <Border Background="LightCoral" >
                      <TextBlock Text="{Binding Path=Name}" FontWeight="Bold" HorizontalAlignment="Center" VerticalAlignment="Center" Padding="40" />
                  </Border>
              </sdk:HierarchicalDataTemplate>
      </UserControl.Resources>
      
    6. Insert the XAML markup below to create your Grid layout, the C1OrgChart control, and the ScrollViewer control:

      XAML
      Copy Code
      <Grid.RowDefinitions>
                  <RowDefinition Height="Auto" />
                  <RowDefinition Height="118*" />
                  <RowDefinition Height="158*" />
              </Grid.RowDefinitions>
              <!-- sample title -->
              <StackPanel Orientation="Horizontal" >
                  <TextBlock Text="C1OrgChart: HierarchicalDataTemplate" FontSize="16" VerticalAlignment="Bottom" />
                  <TextBlock Name="_tbTotal" VerticalAlignment="Bottom" />
              </StackPanel>
              <ScrollViewer Grid.Row="1" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" Padding="0" >
                  <c1:C1OrgChart
                      Name="_chart" ItemTemplate="{StaticResource LeagueTemplate}"
                      ConnectorDashArray="1 2" ConnectorStroke="Gray"
                      HorizontalAlignment="Center" VerticalAlignment="Center" />
              </ScrollViewer>
      
    7. Locate a general TreeView control in your ToolBox and add that to your application below the <ScrollViewer></ScrollViewer> tags. Insert the following into the <sdk:TreeView> tag:

      Name="_tree" Grid.Row="2" ItemTemplate="{StaticResource LeagueTemplate}"
      
      
    8. Switch to your code view by right-clicking your application and selecting View Code from the list.
    9. Add the following code directly below the InitializeComponent() method:

      Visual Basic
      Copy Code
      ' create data object
              Dim league__1 = League.GetLeague()
              ' show it in C1OrgChart
              _chart.Header = league__1
              ' this has the same effect:
              '_chart.ItemsSource = new object[] { league };
              ' show it in TreeView
              _tree.ItemsSource = New Object() {league__1}
      

       

      C#
      Copy Code
      // create data object
                  var league = League.GetLeague();
                  // show it in C1OrgChart
                  _chart.Header = league;
                  // this has the same effect:
                  //_chart.ItemsSource = new object[] { league };
                  // show it in TreeView
                  _tree.ItemsSource = new object[] { league };
              }
          }
      
    10. Insert the following code to create the teams, Leagues, and Divisions that will appear in the C1OrgChart and in the TreeView control:

      Visual Basic
      Copy Code
      Public Class League
              Public Property Name() As String
                  Get
                      Return m_Name
                  End Get
                  Set(value As String)
                      m_Name = Value
                  End Set
              End Property
              Private m_Name As String
              Public Property Divisions() As List(Of Division)
                  Get
                      Return m_Divisions
                  End Get
                  Set(value As List(Of Division))
                      m_Divisions = Value
                  End Set
              End Property
              Private m_Divisions As List(Of Division)
              Public Shared Function GetLeague() As League
                  Dim league = New League()
                  league.Name = "Main League"
                  league.Divisions = New List(Of Division)()
                  For Each div In "North,South,East,West".Split(","c)
                      Dim d = New Division()
                      league.Divisions.Add(d)
                      d.Name = div
                      d.Teams = New List(Of Team)()
                      For Each team In "t1,t2,t3,t4".Split(","c)
                          Dim t = New Team()
                          d.Teams.Add(t)
                          t.Name = String.Format("{0} {1}", team, div)
                      Next
                  Next
                  Return league
              End Function
          End Class
      

       

      C#
      Copy Code
      public class League
          {
              public string Name { get; set; }
              public List<Division> Divisions { get; set; }
              public static League GetLeague()
              {
                  var league = new League();
                  league.Name = "Main League";
                  league.Divisions = new List<Division>();
                  foreach (var div in "North,South,East,West".Split(','))
                  {
                      var d = new Division();
                      league.Divisions.Add(d);
                      d.Name = div;
                      d.Teams = new List<Team>();
                      foreach (var team in "t1,t2,t3,t4".Split(','))
                      {
                          var t = new Team();
                          d.Teams.Add(t);
                          t.Name = string.Format("{0} {1}", team, div);
                      }
                  }
                  return league;
      
    11. Add the code below to create the Public Class that will Get and Set the values for the Teams, Divisions, and Leagues:

      Visual Basic
      Copy Code
      Public Class Division
              Public Property Name() As String
                  Get
                      Return m_Name
                  End Get
                  Set(value As String)
                      m_Name = Value
                  End Set
              End Property
              Private m_Name As String
              Public Property Teams() As List(Of Team)
                  Get
                      Return m_Teams
                  End Get
                  Set(value As List(Of Team))
                      m_Teams = Value
                  End Set
              End Property
              Private m_Teams As List(Of Team)
          End Class
          Public Class Team
              Public Property Name() As String
                  Get
                      Return m_Name
                  End Get
                  Set(value As String)
                      m_Name = Value
                  End Set
              End Property
              Private m_Name As String
          End Class
      

       

      C#
      Copy Code
      public class Division
          {
              public string Name { get; set; }
              public List<Team> Teams { get; set; }
          }
          public class Team
          {
              public string Name { get; set; }
          }
      }
      
    12. Run your application. Your application should resemble the following image:

       

      C1OrgChart for WPF