ContentControl.ContentTemplateSelector Propiedad

Definición

Obtiene o establece un selector de plantillas que permite a los autores de aplicaciones proporcionar una lógica de selección de plantillas personalizada.

public:
 property System::Windows::Controls::DataTemplateSelector ^ ContentTemplateSelector { System::Windows::Controls::DataTemplateSelector ^ get(); void set(System::Windows::Controls::DataTemplateSelector ^ value); };
[System.ComponentModel.Bindable(true)]
public System.Windows.Controls.DataTemplateSelector ContentTemplateSelector { get; set; }
[<System.ComponentModel.Bindable(true)>]
member this.ContentTemplateSelector : System.Windows.Controls.DataTemplateSelector with get, set
Public Property ContentTemplateSelector As DataTemplateSelector

Valor de propiedad

DataTemplateSelector

Selector de plantillas de datos. El valor predeterminado es null.

Atributos

Ejemplos

En el ejemplo siguiente se muestra cómo usar la propiedad ContentTemplateSelector. En este ejemplo se enlaza el elemento seleccionado de a ComboBox la Content propiedad de , Labelque hereda de ContentControl. Cuando el usuario selecciona un valor por debajo de 5, el valor del elemento seleccionado aparece en un cuadrado negro en .Label Cuando el usuario selecciona un valor que es 5 o superior, el valor aparece en una elipse verde. El ejemplo lo logra creando dos DataTemplate objetos y un DataTemplateSelector, que se establece en la ContentTemplateSelector propiedad y elige el adecuado DataTemplate en función del valor del elemento seleccionado.

<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:NumberDataTemplateSelector x:Key="numberTemplateSelector"
                                    NumberTemplate="{StaticResource numberTemplate}"
                                    LargeNumberTemplate="{StaticResource largeNumberTemplate}"/>

</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>
public class NumberDataTemplateSelector : DataTemplateSelector
{
    public DataTemplate NumberTemplate { get; set; }
    public DataTemplate LargeNumberTemplate { get; set; }

    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        // Null value can be passed by IDE designer
        if (item == null) return null;

        var num = Convert.ToInt32((string)item);
        
        // Select one of the DataTemplate objects, based on the 
        // value of the selected item in the ComboBox.
        if (num < 5)
        {
            return NumberTemplate;
        }
        else
        {
            return LargeNumberTemplate;
        }
    }
}
Public Class NumberDataTemplateSelector
    Inherits DataTemplateSelector

    Public Property NumberTemplate As DataTemplate
    Public Property LargeNumberTemplate As DataTemplate

    Public Overrides Function SelectTemplate(ByVal item As Object, _
                    ByVal container As DependencyObject) As DataTemplate

        ' Nothing can be passed by IDE designer
        if (item Is Nothing) Then
            Return Nothing
        End If

        Dim num = Convert.ToInt32(CStr(item))

        ' Select one of the DataTemplate objects, based on the 
        ' value of the selected item in the ComboBox.
        If num < 5 Then
            Return NumberTemplate

        Else
            Return LargeNumberTemplate
        End If

    End Function 'SelectTemplate
End Class

Comentarios

Normalmente, se crea un DataTemplateSelector cuando se tiene más de uno DataTemplate para el mismo tipo de objetos y se desea proporcionar su propia lógica para elegir un DataTemplate objeto que se aplique en función de las propiedades de cada objeto de datos. Tenga en cuenta que si tiene objetos de diferentes tipos, puede establecer la DataType propiedad en .DataTemplate Si lo hace, no es necesario crear un DataTemplateSelector. Además, si tiene objetos del mismo tipo pero con propiedades diferentes, también puede considerar el uso de un DataTrigger convertidor de datos o . Para más información, consulte Información general sobre plantillas de datos.

Para crear un selector de plantillas, cree una clase que herede de DataTemplateSelector e invalide el SelectTemplate método . Una vez definida la clase, puede asignar una instancia de la clase a la propiedad del selector de plantillas del elemento.

Si se establecen las ContentTemplateSelector propiedades y ContentTemplate , se omite esta propiedad.

Uso de atributos XAML

<object ContentTemplateSelector="{ResourceExtension TemplateSelectorKey}"/>  

Valores XAML

ResourceExtension
Extensión de marcado que identifica cómo hacer referencia al recurso de plantilla, ya sea StaticResource o DynamicResource. Consulta Recursos XAML.

TemplateSelectorKey
Clave que identifica el selector de plantillas solicitado. La clave hace referencia a un recurso existente en .ResourceDictionary

Información sobre propiedades de dependencia

Campo identificador ContentTemplateSelectorProperty
Propiedades de metadatos establecidas en true Ninguno

Se aplica a