ItemTemplateSelector playbook WPF. :
App.xaml
<DataTemplate x:Key="MaleTemplate">
<StackPanel Orientation="Horizontal">
<TextBlock Text="M - " />
<TextBlock Text="{Binding Name}" />
</StackPanel>
</DataTemplate>
<DataTemplate x:Key="FemaleTemplate">
<StackPanel Orientation="Horizontal">
<TextBlock Text="F - " />
<TextBlock Text="{Binding Name}" />
</StackPanel>
</DataTemplate>
MainPage.xaml
<UserControl.Resources>
<local:PersonTemplateSelector x:Key="PersonTemplateSelector" />
</UserControl.Resources>
<Grid x:Name="LayoutRoot">
<local:CustomItemsControl ItemsSource="{Binding}" ItemTemplateSelector="{StaticResource PersonTemplateSelector}" />
</Grid>
MainPage.xaml.cs
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
this.DataContext = Person.GetSampleData();
}
}
PersonTemplateSelector.cs
public class PersonTemplateSelector : DataTemplateSelector
{
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
var person = item as Person;
if (person != null)
{
switch (person.Gender)
{
case Gender.Male:
return Application.Current.Resources["MaleTemplate"] as DataTemplate;
case Gender.Female:
return Application.Current.Resources["FemaleTemplate"] as DataTemplate;
default:
throw new ArgumentOutOfRangeException();
}
}
return null;
}
}
, , , CustomItemsControl - :
CustomItemsControl.cs
public class CustomItemsControl : ItemsControl
{
public DataTemplateSelector ItemTemplateSelector
{
get { return (DataTemplateSelector)GetValue(ItemTemplateSelectorProperty); }
set { SetValue(ItemTemplateSelectorProperty, value); }
}
public static readonly DependencyProperty ItemTemplateSelectorProperty =
DependencyProperty.Register("ItemTemplateSelector", typeof(DataTemplateSelector), typeof(CustomItemsControl), new PropertyMetadata(null));
protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
{
ContentPresenter presenter = element as ContentPresenter;
if (presenter != null)
{
DataTemplate itemTemplate = null;
if (base.ItemTemplate != null)
{
itemTemplate = base.ItemTemplate;
}
else if (this.ItemTemplateSelector != null)
{
itemTemplate = this.ItemTemplateSelector.SelectTemplate(item, element);
}
presenter.Content = item;
presenter.ContentTemplate = itemTemplate;
}
}
}
public class DataTemplateSelector
{
public virtual DataTemplate SelectTemplate(object item, DependencyObject container)
{
return null;
}
}