TabControl.ContentTemplateSelector Propiedad

Definición

Obtiene o establece un DataTemplateSelector que proporciona lógica personalizada a fin de elegir la plantilla que se utiliza para mostrar el contenido del control.

public:
 property System::Windows::Controls::DataTemplateSelector ^ ContentTemplateSelector { System::Windows::Controls::DataTemplateSelector ^ get(); void set(System::Windows::Controls::DataTemplateSelector ^ value); };
public System.Windows.Controls.DataTemplateSelector ContentTemplateSelector { get; set; }
member this.ContentTemplateSelector : System.Windows.Controls.DataTemplateSelector with get, set
Public Property ContentTemplateSelector As DataTemplateSelector

Valor de propiedad

DataTemplateSelector

Objeto ContentTemplateSelector. De manera predeterminada, es null.

Ejemplos

En el ejemplo siguiente se usa la ContentTemplateSelector propiedad para mostrar el contenido de de TabItem forma diferente, dependiendo de la ciudad natal de la persona seleccionada.

<DataTemplate x:Key="DetailTemplate">
  <Border Width="300" Height="100" Margin="20"
          BorderBrush="Aqua" BorderThickness="1" Padding="8">
    <Grid>
      <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition/>
        <RowDefinition/>
      </Grid.RowDefinitions>
      <Grid.ColumnDefinitions>
        <ColumnDefinition Width="100"/>
        <ColumnDefinition/>
      </Grid.ColumnDefinitions>
      <TextBlock Grid.Row="0" Grid.Column="0" Text="First Name:"/>
      <TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding Path=FirstName}"/>
      <TextBlock Grid.Row="1" Grid.Column="0" Text="Last Name:"/>
      <TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding Path=LastName}"/>
      <TextBlock Grid.Row="2" Grid.Column="0" Text="Home Town:"/>
      <TextBox Grid.Row="2" Grid.Column="1" Text="{Binding Path=HomeTown}"/>
    </Grid>
  </Border>
</DataTemplate>

<DataTemplate x:Key="SeattleTemplate">
  <DataTemplate.Resources>
    <Style TargetType="TextBlock">
      <Setter Property="FontSize" Value="16"/>
    </Style>
  </DataTemplate.Resources>
  <Border Width="300" Height="100" Margin="20"
          BorderBrush="DarkSeaGreen" BorderThickness="3" Padding="15">
    <Grid>
      <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition/>
        <RowDefinition/>
      </Grid.RowDefinitions>
      <Grid.ColumnDefinitions>
        <ColumnDefinition Width="120"/>
        <ColumnDefinition/>
      </Grid.ColumnDefinitions>
      <TextBlock Grid.Row="0" Grid.Column="0" Text="Please welcome"/>
      <DockPanel Grid.Row="0" Grid.Column="1" >
        <TextBlock Text="{Binding Path=FirstName}"/>
        <TextBlock Text=" "/>
        <TextBlock Text="{Binding Path=LastName}"/>
      </DockPanel>
      <TextBlock Grid.Row="1" Grid.ColumnSpan="2" Text="from the Emerald City!"/>
    </Grid>
  </Border>
</DataTemplate>
<!--Bind to the collection MyFriends and use a DataTemplateSelector
to specify the appearance of the content.-->
<TabControl Name="tabCtrl1" Width="400" Height="200" 
         ItemsSource="{Binding Source={StaticResource MyFriends}}"
         ContentTemplateSelector="{StaticResource PersonSelector}"/>
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections.ObjectModel;
using System.ComponentModel;

namespace TabControlContentTemplateSelector
{
    // Create a class that represents a person.  
    // This class contains a person's first name, last name, 
    // and hometown.
    public class Person : INotifyPropertyChanged
    {
        private string firstname;
        private string lastname;
        private string hometown;

        public event PropertyChangedEventHandler PropertyChanged;

        public Person()
        {
        }

        public Person(string first, string last, string town)
        {
            this.firstname = first;
            this.lastname = last;
            this.hometown = town;
        }

        public override string ToString()
        {
            return firstname.ToString();
        }

        public string FirstName
        {
            get { return firstname; }
            set
            {
                firstname = value;
                OnPropertyChanged("FirstName");
            }
        }

        public string LastName
        {
            get { return lastname; }
            set
            {
                lastname = value;
                OnPropertyChanged("LastName");
            }
        }

        public string HomeTown
        {
            get { return hometown; }
            set
            {
                hometown = value;
                OnPropertyChanged("HomeTown");
            }
        }

        protected void OnPropertyChanged(string info)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(info));
            }
        }
    }
public class PersonTemplateSelector : DataTemplateSelector
{
    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {

        // The content of each TabItem is a Person object.
        if (item is Person)
        {
            Person person = item as Person;

            Window win = Application.Current.MainWindow;

            // Select one of the DataTemplate objects, based on the 
            // person's home town.
            if (person.HomeTown == "Seattle")
            {
                return win.FindResource("SeattleTemplate") as DataTemplate;
            }
            else
            {
                return win.FindResource("DetailTemplate") as DataTemplate;
            }
        }

        return null;
    }
}
Imports System.ComponentModel

Public Class Person
    Implements INotifyPropertyChanged

    ' Events
    Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged

    ' Methods
    Public Sub New()
    End Sub

    Public Sub New(ByVal first As String, ByVal last As String, ByVal town As String)
        Me._firstname = first
        Me._lastname = last
        Me._hometown = town
    End Sub

    Private Sub OnPropertyChanged(ByVal info As String)
        RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(info))
    End Sub

    Public Overrides Function ToString() As String
        Return Me._firstname.ToString
    End Function


    ' Properties
    Public Property FirstName() As String
        Get
            Return Me._firstname
        End Get
        Set(ByVal value As String)
            Me._firstname = value
            Me.OnPropertyChanged("FirstName")
        End Set
    End Property

    Public Property HomeTown() As String
        Get
            Return Me._hometown
        End Get
        Set(ByVal value As String)
            Me._hometown = value
            Me.OnPropertyChanged("HomeTown")
        End Set
    End Property

    Public Property LastName() As String
        Get
            Return Me._lastname
        End Get
        Set(ByVal value As String)
            Me._lastname = value
            Me.OnPropertyChanged("LastName")
        End Set
    End Property


    ' Fields
    Private _firstname As String
    Private _hometown As String
    Private _lastname As String
End Class
Public Class PersonTemplateSelector
    Inherits DataTemplateSelector

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

        ' The content of each TabItem is a Person object.
        If TypeOf item Is Person Then

            Dim person As Person = item

            Dim win As Window = Application.Current.MainWindow

            ' Select one of the DataTemplate objects, based on the 
            ' person's home town.
            If person.HomeTown = "Seattle" Then
                Return win.FindResource("SeattleTemplate")
            Else
                Return win.FindResource("DetailTemplate")

            End If
        End If

        Return Nothing
    End Function

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 DataTemplateSelectorClassKey}"/>  

Uso de elementos de propiedad XAML

<object>  
  <object.ContentTemplateSelector>  
    <MyDataTemplateSelectorImplementation .../>  
  </object.ContentTemplateSelector>  
</object>  

Valores XAML

ResourceExtension
Uno de los siguientes: StaticResource, o DynamicResource. Consulta Recursos XAML.

DataTemplateSelectorClassKey
Clave que identifica la implementación del selector que se solicita. La clave hace referencia a una clase derivada que implementa una invalidación práctica SelectTemplate . Para obtener información sobre cómo asignar la clase personalizada, consulta Espacios de nombres XAML y Asignación de espacios de nombres para XAML de WPF. También puede agregar mediante programación una instancia de la DataTemplateSelector clase como un recurso a un diccionario de recursos.

MyDataTemplateSelectorImplementation
Una clase derivada de DataTemplateSelector e invalida SelectTemplate. Para obtener información sobre cómo asignar la clase personalizada, consulta Espacios de nombres XAML y Asignación de espacios de nombres para XAML de WPF.

Información sobre propiedades de dependencia

Campo identificador ContentTemplateSelectorProperty
Propiedades de metadatos establecidas en true Ninguno

Se aplica a