Master Detail Binding
<Window x:Class="WpfApplication1.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MasterDetailBinding" xmlns:local="clr-namespace:WpfApplication1"> <Window.Resources> <local:Companies x:Key="Companies"> <local:Company CompanyName="Stooge"> <local:Company.Members> <local:Team> <local:Employee Name="Larry" Age="21"> <local:Employee.Skills> <local:Skills> <local:Skill Description="A" /> <local:Skill Description="B" /> <local:Skill Description="C" /> </local:Skills> </local:Employee.Skills> </local:Employee> <local:Employee Name="Moe" Age="22" > <local:Employee.Skills> <local:Skills> <local:Skill Description="D" /> <local:Skill Description="E" /> </local:Skills> </local:Employee.Skills> </local:Employee> <local:Employee Name="Curly" Age="23" > <local:Employee.Skills> <local:Skills> <local:Skill Description="F" /> <local:Skill Description="G" /> </local:Skills> </local:Employee.Skills> </local:Employee> </local:Team> </local:Company.Members> </local:Company> <local:Company CompanyName="Addams"> <local:Company.Members> <local:Team> <local:Employee Name="Gomez" Age="135" > <local:Employee.Skills> <local:Skills> <local:Skill Description="H" /> <local:Skill Description="Z" /> <local:Skill Description="Q" /> </local:Skills> </local:Employee.Skills> </local:Employee> <local:Employee Name="Morticia" Age="121" > <local:Employee.Skills> <local:Skills> <local:Skill Description="R" /> <local:Skill Description="P" /> <local:Skill Description="L" /> </local:Skills> </local:Employee.Skills> </local:Employee> <local:Employee Name="Fester" Age="137" > <local:Employee.Skills> <local:Skills> <local:Skill Description="R" /> <local:Skill Description="S" /> <local:Skill Description="U" /> </local:Skills> </local:Employee.Skills> </local:Employee> </local:Team> </local:Company.Members> </local:Company> </local:Companies> </Window.Resources> <Grid DataContext="{StaticResource Companies}"> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition /> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition /> <ColumnDefinition /> <ColumnDefinition /> </Grid.ColumnDefinitions> <TextBlock Grid.Row="0" Grid.Column="0">Companies:</TextBlock> <ListBox Grid.Row="1" Grid.Column="0" ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="True"> <ListBox.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding Path=CompanyName}" /> </DataTemplate> </ListBox.ItemTemplate> </ListBox> <StackPanel Grid.Row="0" Grid.Column="1" Orientation="Horizontal"> <TextBlock Text="{Binding Path=CompanyName}" /> <TextBlock Text=" Company Members:" /> </StackPanel> <ListBox Grid.Row="1" Grid.Column="1" ItemsSource="{Binding Path=Members}" IsSynchronizedWithCurrentItem="True"> <ListBox.ItemTemplate> <DataTemplate> <TextBlock> <TextBlock Text="{Binding Path=Name}" /> (age: <TextBlock Text="{Binding Path=Age}" />) </TextBlock> </DataTemplate> </ListBox.ItemTemplate> </ListBox> <StackPanel Grid.Row="0" Grid.Column="2" Orientation="Horizontal"> <TextBlock Text="{Binding Path=Members/Name}" /> <TextBlock Text=" Skills:" /> </StackPanel> <ListBox Grid.Row="1" Grid.Column="2" ItemsSource="{Binding Path=Members/Skills}" IsSynchronizedWithCurrentItem="True"> <ListBox.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding Path=Description}" /> </DataTemplate> </ListBox.ItemTemplate> </ListBox> </Grid> </Window> //File:Window.xaml.cs using System; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Media; using System.Windows.Shapes; using System.Collections.ObjectModel; namespace WpfApplication1 { public class Skill { string description; public string Description { get { return description; } set { description = value; } } } public class Skills : ObservableCollection<Skill> { } public class Employee { string name; public string Name { get { return name; } set { name = value; } } int age; public int Age { get { return age; } set { age = value; } } Skills traits; public Skills Skills { get { return traits; } set { traits = value; } } } public class Team : ObservableCollection<Employee> { } public class Company { string familyName; public string CompanyName { get { return familyName; } set { familyName = value; } } Team members; public Team Members { get { return members; } set { members = value; } } } public class Companies : ObservableCollection<Company> { } public partial class Window1 : Window { public Window1() { InitializeComponent(); } } }