Export (0) Print
Expand All

ContentControl.ContentTemplateSelector Property

Gets or sets a template selector that enables an application writer to provide custom template-selection logic.

Namespace:  System.Windows.Controls
Assembly:  PresentationFramework (in PresentationFramework.dll)
XMLNS for XAML: http://schemas.microsoft.com/winfx/2006/xaml/presentation, http://schemas.microsoft.com/netfx/2007/xaml/presentation

[BindableAttribute(true)]
public DataTemplateSelector ContentTemplateSelector { get; set; }
<object>
  <object.ContentTemplateSelector>
    <DataTemplateSelector .../>
  </object.ContentTemplateSelector>
</object>
<object ContentTemplateSelector="{ResourceExtension TemplateSelectorKey}"/>

XAML Values

ResourceExtension

A markup extension that identifies how to reference the template resource, either StaticResource or DynamicResource. See Resources Overview.

TemplateSelectorKey

The key that identifies the requested template selector. The key refers to an existing resource in a ResourceDictionary.

Property Value

Type: System.Windows.Controls.DataTemplateSelector
A data template selector. The default value is null.

Identifier field

ContentTemplateSelectorProperty

Metadata properties set to true

None

Typically, you create a DataTemplateSelector when you have more than one DataTemplate for the same type of objects and you want to supply your own logic to choose a DataTemplate to apply based on the properties of each data object. Note that if you have objects of different types you can set the DataType property on the DataTemplate. If you do that, then there is no need to create a DataTemplateSelector. Furthermore, if you have objects of the same type but with different properties, you can also consider using a DataTrigger or a data converter. For more information, see Data Templating Overview.

To create a template selector, create a class that inherits from DataTemplateSelector and override the SelectTemplate method. After your class is defined, you can assign an instance of the class to the template selector property of your element.

If both the ContentTemplateSelector and the ContentTemplate properties are set, then this property is ignored.

The following example shows how to use the ContentTemplateSelector property. This example binds the selected item in a ComboBox to the Content property of a Label, which inherits from ContentControl. When the user selects a value below 5, the value of the selected item appears in a black square in the Label. When the user selects a value that is 5 or above, the value appears in a green ellipse. The example accomplishes this by creating two DataTemplate objects and a DataTemplateSelector, which is set to the ContentTemplateSelector property and chooses the appropriate DataTemplate based on the value of the selected item.


public class NumderDataTemplateSelector : DataTemplateSelector
{
    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        string numberStr = item as string;

        if (numberStr != null)
        {
            int num;
            Window win = Application.Current.MainWindow;

            try
            {
                num = Convert.ToInt32(numberStr);
            }
            catch
            {
                return null;
            }

            // Select one of the DataTemplate objects, based on the 
            // value of the selected item in the ComboBox.
            if (num < 5)
            {
                return win.FindResource("numberTemplate") as DataTemplate;
            }
            else
            {
                return win.FindResource("largeNumberTemplate") as DataTemplate;

            }
        }

        return null;
    }

}



<Window.Resources>

  <!--Create two DataTemplate objects to be 
  selected by the DataTemplateSelector.-->
  <DataTemplate x:Key="numberTemplate">
    <Grid>
      <Rectangle Stroke="Black" />
      <TextBlock Margin="5" Text="{Binding}" FontSize="18"/>
    </Grid>
  </DataTemplate>

  <DataTemplate x:Key="largeNumberTemplate">
    <Grid>
      <Ellipse Stroke="Green" StrokeThickness="4"/>
      <TextBlock Margin="10" Text="{Binding}" FontSize="24" 
                 Foreground="Red" FontWeight="Bold" />
    </Grid>
  </DataTemplate>

  <local:NumderDataTemplateSelector x:Key="numberTemplateSelector"/>

</Window.Resources>
<StackPanel>

  <!--Bind the content of the Label to the selected item 
  in the ComboBox.-->
  <Label  Foreground="Black"
          Content="{Binding ElementName=numberList, Path=SelectedItem.Content}"
          ContentTemplateSelector="{StaticResource numberTemplateSelector}">
  </Label>

  <ComboBox Name="numberList">
    <ComboBoxItem>1</ComboBoxItem>
    <ComboBoxItem>2</ComboBoxItem>
    <ComboBoxItem>3</ComboBoxItem>
    <ComboBoxItem>4</ComboBoxItem>
    <ComboBoxItem>5</ComboBoxItem>
    <ComboBoxItem>6</ComboBoxItem>
    <ComboBoxItem IsSelected="True">7</ComboBoxItem>
    <ComboBoxItem>8</ComboBoxItem>
    <ComboBoxItem>9</ComboBoxItem>
    <ComboBoxItem>10</ComboBoxItem>
  </ComboBox>

</StackPanel>


.NET Framework

Supported in: 4, 3.5, 3.0

.NET Framework Client Profile

Supported in: 4, 3.5 SP1

Windows 7, Windows Vista SP1 or later, Windows XP SP3, Windows Server 2008 (Server Core not supported), Windows Server 2008 R2 (Server Core supported with SP1 or later), Windows Server 2003 SP2

The .NET Framework does not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.

Community Additions

ADD
Show:
© 2014 Microsoft