ContentControl.ContentTemplateSelector Propiedad
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
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
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 |