<Window x:Class="WpfApplication1.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:WpfApplication1" Title="Introduction to Data Templating Sample"> <Window.Resources> <local:Employees x:Key="myTodoList"/> <local:EmployeeListDataTemplateSelector x:Key="myDataTemplateSelector"/> <DataTemplate x:Key="importantEmployeeTemplate"> <DockPanel HorizontalAlignment="Center"> <TextBlock Text="{Binding Path=Description}" /> </DockPanel> </DataTemplate> <DataTemplate x:Key="myEmployeeTemplate"> <StackPanel> <TextBlock Text="Employee Name:"/> <TextBlock Text="{Binding Path=EmployeeName}" /> <TextBlock Text="Description:"/> <TextBlock Text="{Binding Path=Description}"/> <TextBlock Text="Priority:"/> <TextBlock Text="{Binding Path=Priority}"/> </StackPanel> <DataTemplate.Triggers> <DataTrigger Binding="{Binding Path=EmployeeType}"> <DataTrigger.Value> <local:EmployeeType>Factory</local:EmployeeType> </DataTrigger.Value> </DataTrigger> </DataTemplate.Triggers> </DataTemplate> </Window.Resources> <StackPanel> <ListBox ItemsSource="{Binding Source={StaticResource myTodoList}}" ItemTemplateSelector="{StaticResource myDataTemplateSelector}" HorizontalContentAlignment="Stretch" IsSynchronizedWithCurrentItem="True"/> <ContentControl Content="{Binding Source={StaticResource myTodoList}}" ContentTemplate="{StaticResource myEmployeeTemplate}"/> </StackPanel> </Window> //File:Window.xaml.cs using System; using System.ComponentModel; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Data; using System.Windows.Media; using System.Collections.ObjectModel; using System.ComponentModel; namespace WpfApplication1 { public partial class Window1 : Window { public Window1() { InitializeComponent(); } } public class Employee : INotifyPropertyChanged { private string name; private string description; private int priority; private EmployeeType type; public event PropertyChangedEventHandler PropertyChanged; public Employee() { } public Employee(string name, string description, int priority, EmployeeType type) { this.name = name; this.description = description; this.priority = priority; this.type = type; } public override string ToString() { return name.ToString(); } public string EmployeeName { get { return name; } set { name = value; OnPropertyChanged("EmployeeName"); } } public string Description { get { return description; } set { description = value; OnPropertyChanged("Description"); } } public int Priority { get { return priority; } set { priority = value; OnPropertyChanged("Priority"); } } public EmployeeType EmployeeType { get { return type; } set { type = value; OnPropertyChanged("EmployeeType"); } } protected void OnPropertyChanged(string info) { PropertyChangedEventHandler handler = PropertyChanged; if (handler != null) { handler(this, new PropertyChangedEventArgs(info)); } } } public class Employees : ObservableCollection<Employee> { public Employees(): base() { Add(new Employee("A", "Cut", 2, EmployeeType.Factory)); Add(new Employee("B", "Fix", 2, EmployeeType.Factory)); Add(new Employee("C", "Email", 1, EmployeeType.Office)); Add(new Employee("D", "Read", 3, EmployeeType.Office)); Add(new Employee("E", "Clean", 1, EmployeeType.Factory)); Add(new Employee("F", "Review", 2, EmployeeType.Office)); } } public enum EmployeeType { Factory, Office } public class EmployeeListDataTemplateSelector : DataTemplateSelector { public override DataTemplate SelectTemplate(object item, DependencyObject container) { if (item != null && item is Employee) { Employee taskitem = item as Employee; Window window = Application.Current.MainWindow; if (taskitem.Priority == 1) return window.FindResource("importantEmployeeTemplate") as DataTemplate; else return window.FindResource("myEmployeeTemplate") as DataTemplate; } return null; } } }